in reply to Constructing a list of regexes
As Enlil already pointed out, the problem is that the s/// and qr// operators don't take the same options. A quick consultation with the Camel book reveals that the qr// operator only accepts modifiers from the set "ismxo".
Another approach you could consider is to use a hash instead of a list, with the keys being the regex as you already use, and the value being true or false (1 or 0) depending on whether you want global matching or not. Not elegant, but it works.
use strict; sub make_regex_list{ my %regexes; foreach my $strings (@_) { my($regex_string,$options)=@$strings; if ($options =~ /g/) { $regexes{qr/(?$options)$regex_string/} = 1; } else { $regexes{qr/(?$options)$regex_string/} = 0; } } return %regexes; } my $string = "Jack Jack John"; # in real code this array would be constructed # from a file my @reStrings = (["jack","ig"],["john","i"]); my %regexes = make_regex_list(@reStrings); foreach my $regex (keys %regexes) { if ($regexes{$regex}) { print "Using $regex in global mode\n"; $string =~ s/$regex/name/g; print $string."\n"; } else { print "Using $regex\n"; $string =~ s/$regex/name/; print $string."\n"; } }
Results in,
Using (?-xism:(?i)john) Jack Jack name Using (?-xism:(?ig)jack) in global mode name name name
|
|---|