http://www.perlmonks.org?node_id=180667


in reply to Regex without 'm' or '/'
in thread Am I on the pipe, or what?

What I cannot find in the on-line docs

Its an operator thing, not a regex thing --- from perlop under "Binding Operators":

... If the right argument is an expression rather than a search pattern, substitution, or transliteration, it is interpreted as a search pattern at run time. This can be less efficient than an explicit search, because the pat- tern must be compiled every time the expression is evalu- ated.

This can sometimes cause problems for newcomers, especially when they use split with a double-quoted string as the split pattern (as seems to happen with undue frequency) and have an escaped metacharacter in the pattern:

$_ = 'this has a | pipe'; @a = split /\|/; # good print join(":", @a),"\n"; @a = split "\|"; # oops print join(":", @a),"\n";

In the second case, the double-quoted string is first evaluated and the *resulting* string (sans backslash) is then used as the pattern in the regex.

Replies are listed 'Best First'.
Re: Re: Regex without 'm' or '/'
by hv (Prior) on Feb 24, 2003 at 01:19 UTC
    If the right argument is an expression rather than a search pattern, substitution, or transliteration, it is interpreted as a search pattern at run time. This can be less efficient than an explicit search, because the pat- tern must be compiled every time the expression is evalu- ated.

    This perlop text must be a holdover from a while back. At least as far back as 5.005_03, code like $str1 =~ 'bc' (with a constant string for the pattern) would be compiled only once. Between 5.6.0 and 5.6.1 an extra check was added, so that even $str =~ $str2 would not be recompiled as long as $str2 had not changed.

    I guess the second statement should simply be deleted from that paragraph.

    Hugo