It works with (?=\0) so I'd say it comes from zero-width assertions preventing optimization.
Edit : In this special case (single word without a j at the end) it also works with \b
| [reply] [Watch: Dir/Any] [d/l] |
c:\@Work\Perl\monks>perl -wMstrict -le
"my @answer;
'asdfgfhjkljx' =~ /f.*j(?{push @answer, $&})\b/;
print for @answer;
"
fgfhjklj
fgfhj
fhjklj
fhj
c:\@Work\Perl\monks>perl -wMstrict -le
"my @answer;
'asdfgfhjklj' =~ /f.*j(?{push @answer, $&})\b/;
print for @answer;
"
fgfhjklj
Personally, I feel more comfortable using something that cannot possibly be true to force backtracking, like (?!) or, from Perl 5.10 on, (*FAIL) or (*F) even though they take more keystrokes to type.
Update: Oops... I missed "... this special case (single word without a j at the end) ..." in Eily's post; see Eily's reply below.
Give a man a fish: <%-{-{-{-<
| [reply] [Watch: Dir/Any] [d/l] [select] |
... unless the string ends with the target character/pattern That's why I said it only worked in this special case, not ending in j. But I agree with you, if you're not trying to golf, (*FAIL) is probably the best option, because it is far more explicit even if you've never seen the construct before. (?!) is still weird enough that you still need to check in the documentation if you don't recognize it, so that's still good.
| [reply] [Watch: Dir/Any] [d/l] [select] |
| [reply] [Watch: Dir/Any] |
| [reply] [Watch: Dir/Any] |
| [reply] [Watch: Dir/Any] |
> but this looks like a fortunate bug, because ^ is a metacharacter in some positions, it's treated differently.
I finally understood that it's not a bug, because ^ is always a metacharacter, in order to match a literal ^ one needs to escape it
And "Match the beginning of the line" will always fail unless modifiers like /m are used
DB<1> p "a^b" =~ /a^b/
DB<2> p "a^b" =~ /a\^b/
1
DB<3> p "\nb" =~ /^b/m
1
| [reply] [Watch: Dir/Any] [d/l] [select] |