I wanted a single regex to match lines containing "bar" if and only if they do not contain "foo" and happened upon some strange behavior
my $str=" some stuff then foo then bar then more stuff";
print "string=\"$str\"\n";
if ($str =~ /(?!.*foo)(^.*bar.*)/) {print "1 matched \"$1\"\n";}
if ($str =~ /(?!^.*foo)(^.*bar.*)/) {print "2 matched \"$1\"\n";}
if ($str =~ /(?!.*foo)(.*bar.*)/) {print "3 matched \"$1\"\n";}
if ($str =~ /(?!^.*foo)(.*bar.*)/) {print "4 matched \"$1\"\n";}
$str=" some stuff then bar then more stuff";
print "string=\"$str\"\n";
if ($str =~ /(?!.*foo)(^.*bar.*)/) {print "5 matched \"$1\"\n";}
if ($str =~ /(?!^.*foo)(^.*bar.*)/) {print "6 matched \"$1\"\n";}
if ($str =~ /(?!.*foo)(.*bar.*)/) {print "7 matched \"$1\"\n";}
if ($str =~ /(?!^.*foo)(.*bar.*)/) {print "8 matched \"$1\"\n";}
for me (Perl v5.8.6 linux) it produces the following output;
string=" some stuff then foo then bar then more stuff"
3 matched "oo then bar then more stuff"
4 matched "some stuff then foo then bar then more stuff"
string=" some stuff then bar then more stuff"
5 matched " some stuff then bar then more stuff"
6 matched " some stuff then bar then more stuff"
7 matched " some stuff then bar then more stuff"
8 matched " some stuff then bar then more stuff"
I don't know a lot about Perl regex can someone explain why 3 and 4 above matched and why they matched was the did?