I am working on some code code that boils down to:
'g'=~/g/; my $regex = 'm{}g'; # user input my $text = 'x'; # user input eval qq{ use re 'debug'; print "<\$&>\\n" while \$text =~ $regex; };
Which only produces this output:
Compiling REx "" Final program: 1: NOTHING (2) 2: END (0) minlen 0 Freeing REx: ""
As per perlop:
The empty pattern //
If the PATTERN evaluates to the empty string, the last successfully matched regular expression is used instead. In this case, only the g and c flags on the empty pattern are honored; the other flags are taken from the original pattern. If no match has previously succeeded, this will (silently) act instead as a genuine empty pattern (which will always match).
So in other words, it's silently (!) matching $text against /g/. Is there some way to reset the state of the regex engine so that the empty pattern always acts as a genuine empty pattern? it acts as if no other regex has been executed before $regex? I think that'd make more sense to the users instead of the current confusing behavior. (I think I'll display a message to the user about the empty pattern in any case.)
Update: Updated explanation in final paragraph.
In reply to Reset meaning of empty pattern? by haukex
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |