in reply to repeatedly delete words expressed in alternation from end of string [regexp]
First, wouldn't it be better to start with a list of words instead of a regex?
my @words = qw( SA NV LTD CO LLC );
So we'll need to build the regex programatically.
my ($re) = map qr/$_/i, join '|', map quotemeta, @words;
Using Regexp::List can greatly speed up the process.
use Regexp::List qw( ); my $re = Regexp::List->new(modifiers => 'i')->list2re(@words);
Now that we have the regex, let's avoid the fragility of 1 while s/// while properly removing spaces.
while (<>) { chomp; s/^ (?: $re \s+ )+//x; s/ (?: \s+ $re )+//xg; print("$_$/"); }
Note: You were using capturing parens ((...)) when you only needed non-capturing parens ((?:...)). Removing the need to capture greatly improves the speed of regexs.
Update: Oops, it could still leave spaces. Fixed.
Update: Added Regexp::List method.
In Section
Seekers of Perl Wisdom