in reply to Re^5: AND and OR on Regular Expressions
in thread AND and OR on Regular Expressions

Some examples:
$_ = "foo bar foo"; $pat1 = "(foo)"; $pat2 = "(bar)"; /$pat1/ && /$pat2/; # Sets $1 (twice). /^(?=.*?$pat1)(?=.*?$pat2)/; # Sets $1 and $2. $pat1 = "(foo)"; $pat2 = "(baz)"; /$pat1/ && /$pat2/; # Sets $1. /^(?=.*?$pat1)(?=.*?$pat2)/; # Doesn't set $1 or $2. $pat1 = "(foo)"; $pat2 = "( )\\g{1}"; /$pat1/ && /$pat2/; # No match. /^(?=.*?$pat1)(?=.*?$pat2)/; # Match!
As for the leading ^ - it only has a speed influence, and only if there's no match. But it can be a significant speed difference if the string is long, so it's better not to omit it.

Replies are listed 'Best First'.
Re^7: AND and OR on Regular Expressions
by ikegami (Patriarch) on Aug 26, 2009 at 00:50 UTC

    So "yes".

    You're missing the line that initialises $_ to something "foo" for the second block.

      I'm not missing that line. All matches are against the same $_.

        Then look again.

        Are you are your saying your comments are wrong

        /$pat1/ && /$pat2/; # Sets $1 (twice). /$pat1/ && /$pat2/; # Sets $1.
        /^(?=.*?$pat1)(?=.*?$pat2)/; # Sets $1 and $2. /^(?=.*?$pat1)(?=.*?$pat2)/; # Doesn't set $1 or $2.

        And that you repeated 4 lines of code for nothing?

        $pat1 = "(foo)"; $pat2 = "(bar)"; /$pat1/ && /$pat2/; /^(?=.*?$pat1)(?=.*?$pat2)/; $pat1 = "(foo)"; $pat2 = "(baz)"; /$pat1/ && /$pat2/; /^(?=.*?$pat1)(?=.*?$pat2)/;

        I swear I checked that a million times first. I'm blind! Needless to say, it would have been clearer to change $_ instead.