in reply to Re^2: Return string that starts and ends with specific characters
in thread Return string that starts and ends with specific characters

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

Replies are listed 'Best First'.
Re^4: Return string that starts and ends with specific characters
by AnomalousMonk (Archbishop) on Jun 02, 2016 at 17:42 UTC
    ... it also works with \b

    ... unless the string ends with the target character/pattern:

    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:  <%-{-{-{-<

      ... 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.

Re^4: Return string that starts and ends with specific characters
by Anonymous Monk on Jun 02, 2016 at 17:02 UTC

    Cool. I picked it up from perl golf, and use ^ because it's shorter :)