If a regexp match fails, then any capture variables ($1, $2, ...) will be unaffected. They will retain
whatever old values they may have had. Therefore it's important to check the return value of a match
before using those variables.
'12312123' =~ /(2)/;
print $1; # Prints 2
'123123123' =~ /(X)/;
print $1; # Prints 2, because $1 has not changed.
Note that because the values of $1 etc will be unaffected, you cannot determine if a match succeeded by
checking to see if the capture variables have values.
# WRONG
$str =~ /foo(.+)/;
if ( $1 ) {
print "I found $1 after 'foo'";
}
This policy checks that the previous regexp for which the capture variable is in-scope is either in a
conditional or causes an exception or other control transfer (i.e. "next", "last", "redo", "return", or
sometimes "goto") if the match fails.
A "goto" is only accepted by this policy if it is a co-routine call (i.e. "goto &foo") or a "goto LABEL"
where the label does not fall between the "goto" and the capture variable in the scope of the "goto". A
computed "goto" (i.e. something like "goto (qw{foo bar baz})[$i]") is not accepted by this policy because
its target can not be statically determined.
This policy does not check whether that conditional is actually testing a regexp result, nor does it
check whether a regexp actually has a capture in it. Those checks are too hard.
This policy also does not check arbitrarily complex conditionals guarding regexp results, for pretty much
the same reason. Simple things like
m/(foo)/ or die "No foo!";
die "No foo!" unless m/(foo)/;
will be handled, but something like
m/(foo)/ or do {
... lots of complicated calculations here ...
die "No foo!";
};
are beyond its scope.