in reply to One line assigment statement with regex match

I tend to use something like this;

my $re = qr/(?:${\( join "|", map { qr/\Q$_\E/ } @terms )})/; ... my ($match) = ($line =~ m/($re)/);

This is especially important if your @terms contain metacharacters such as parantheses, asterix, period, etc.

Also, it is usually faster because you're only doing one regular expression match per line, not many.

$h=$ENV{HOME};my@q=split/\n\n/,`cat $h/.quotes`;$s="$h/." ."signature";$t=`cat $s`;print$t,"\n",$q[rand($#q)],"\n";

Replies are listed 'Best First'.
Re^2: One line assigment statement with regex match
by ketema (Scribe) on Jun 23, 2005 at 15:37 UTC
    I get search pattern not terminated when I try this:
    my $re = qr/(?:${\( join "|", map { qr/\Q$_\E/ } @terms )})/;

      Terribly sorry, I didn't test it.

      Yes, the double use of "/" to delimit regular expressions is tripping up the parser. Much better to use braces;

      @terms=qw(foo bar b.*az); my $re = qr{(?:${\( join "|", map { qr{\Q$_\E} } @terms )})}; print "$re\n";

      The above will print "(?-xism:(?:(?-xism:foo)|(?-xism:bar)|(?-xism:b\.\*az)))"

      $h=$ENV{HOME};my@q=split/\n\n/,`cat $h/.quotes`;$s="$h/." ."signature";$t=`cat $s`;print$t,"\n",$q[rand($#q)],"\n";