Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked
 
PerlMonks  

This regex surprised me

by szabgab (Priest)
on Aug 13, 2014 at 16:51 UTC ( #1097316=perlquestion: print w/replies, xml ) Need Help??

szabgab has asked for the wisdom of the Perl Monks concerning the following question:

In this snippet it looks like the /m modifier does not modify a regex if it came from a pre-compiled regex. (4th print is 0). If I am not mistaken this was not always like this. I think in 5.8.x the 4th print still printed 1. Can you confirm this? Can someone point me to the explanation of this?
use strict; use warnings; my $str = "x\nab\ny"; my $re = '^ab$'; print $str =~ /$re/ ? 1 : 0, "\n"; # 0 print $str =~ /$re/m ? 1 : 0, "\n"; # 1 my $qre = qr/^ab$/; print $str =~ /$qre/ ? 1 : 0, "\n"; # 0 print $str =~ /$qre/m ? 1 : 0, "\n"; # 0 but I think 5.8.x still had + this as 1

Update

Thanks for all the responses and links!

Replies are listed 'Best First'.
Re: This regex surprised me
by Athanasius (Bishop) on Aug 13, 2014 at 17:17 UTC

    Printing the pre-compiled regex, I get:

    3:05 >perl -wE "my $q = qr/^ab$/; say $q;" (?^u:^ab$) 3:06 >

    and from perlre#Extended-Patterns it appears that this is equivalent to (?ud-imsx:^ab$), which explicitly turns off the m modifier throughout of the embeded pattern-match modifier. So adding /m to the regex has no effect, because it is overridden within the (?-m:...) construct inside the regex.

    I don’t know how all this worked in earlier versions of Perl, but in recent versions, it seems you have to add the /m modifier when the regex is first constructed using qr//:

    my $qre = qr/^ab$/m;

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

Re: This regex surprised me
by AppleFritter (Vicar) on Aug 13, 2014 at 18:45 UTC

    This is documented in perl5101delta, under "Other Incompatible Changes":

    This one is actually a change introduced in 5.10.0, but it was missed from that release's perldelta, so it is mentioned here instead.

    A bugfix related to the handling of the /m modifier and qr resulted in a change of behaviour between 5.8.x and 5.10.0:

    # matches in 5.8.x, doesn't match in 5.10.0 $re = qr/^bar/; "foo\nbar" =~ /$re/m;
Re: This regex surprised me
by choroba (Archbishop) on Aug 13, 2014 at 18:32 UTC
    Confirmed: on 5.8.3 and 5.8.5, I'm getting 0101, on 5.10.1, I'm getting 0100.
    لսႽ ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
Re: This regex surprised me ( qr//m, perldeltas, perlcritic )
by Anonymous Monk on Aug 13, 2014 at 21:34 UTC

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1097316]
Approved by Athanasius
Front-paged by sweetblood
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (5)
As of 2020-05-29 07:19 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    If programming languages were movie genres, Perl would be:















    Results (167 votes). Check out past polls.

    Notices?