Thanks Chas., that's interesting! Here's my summary of what I've learnt
from this:

1. The regex

$foo =~ "\Asome string\Z"

is equivalent to

$bar = "\Asome string\Z"; # ends up as 'Asome stringB' with a warning
$foo =~ /$bar/;

i.e evaluate the string first and then stick it into the regex delimiters.

2. I'd never seen m?? before so if anyone else wants a good description and
context for usage see

http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators   (search
for ?PATTERN?)
and http://perldoc.perl.org/functions/continue.html


Andrew



On Fri, Feb 24, 2017 at 1:50 PM, Chas. Owens <chas.ow...@gmail.com> wrote:

> Be careful, it isn't actually a regex; it is a string that will be
> compiled to a regex.  You can see one difference here:
>
> #!/usr/bin/perl
>
> use v5.20;
> use warnings;
>
> say "string matches:";
> for my $s ("foo", "AfooZ") {
> say "\t$s: ", $s =~ "\Afoo\Z" ? "true" : "false";
> }
>
> say "regex matches:";
> for my $s ("foo", "AfooZ") {
> say "\t$s: ", $s =~ /\Afoo\Z/ ? "true" : "false";
> }
>
> which outputs
>
> Unrecognized escape \A passed through at t.pl line 8.
> Unrecognized escape \Z passed through at t.pl line 8.
> string matches:
> foo: false
> AfooZ: true
> regex matches:
> foo: true
> AfooZ: false
>
> To my knowledge, the only delimiters that do not require m or qr before
> them are // and ??; however, they are not equivalent (and ?? must be m?? as
> of Perl 5.22).  The m?? operator only matches the first time it sees a
> pattern and then will not match again until reset is called:
>
> #!/usr/bin/perl
>
> use v5.18;
> use warnings;
>
> for ("fo", "foo", "fooo", "foooo") {
>         my ($match) = ?(fo+)?;
>         say $match // "no match";
>         if (/fooo/) {
>                 reset;
>         }
> }
>
> Which outputs
>
> Use of ?PATTERN? without explicit operator is deprecated at t.pl line 7.
> fo
> no match
> no match
> foooo
>
>
> On Thu, Feb 23, 2017 at 6:53 PM Andrew Solomon <and...@geekuni.com> wrote:
>
>> Thanks Uri!
>>
>> On Thu, Feb 23, 2017 at 10:32 PM, Uri Guttman <u...@stemsystems.com>
>> wrote:
>>
>> On 02/23/2017 05:19 PM, Andrew Solomon wrote:
>>
>> Running Perl 18.2 I was surprised to discover that I can use single and
>> double quotes as regex delimiters without the 'm' operator.
>>
>> For example, instead of writing
>>
>>     "/usr/bin/perl" =~ m"/perl"
>>
>> I can just write
>>
>>     "/usr/bin/perl" =~ "/perl"
>>
>> Can anyone point me to the documentation indicating which delimiters
>> don't need the 'm' operator?
>>
>>
>> you actually are thinking in the wrong direction. the =~ operator causes
>> its right side to always be a regex unless the s/// or m// or tr/// ops are
>> seen there. you can even use an expression or sub call or anything on the
>> right of =~ and it will be parsed as a regex (if no op is there as i just
>> said).
>>
>> you can easily check this out with something simple like "/usr/bin/perl"
>> =~ "/pe" . "rl".
>>
>> so it isn't the delimiters as you think but the =~ op itself that makes
>> it a regex.
>>
>> uri
>>
>> --
>> To unsubscribe, e-mail: beginners-unsubscr...@perl.org
>> For additional commands, e-mail: beginners-h...@perl.org
>> http://learn.perl.org/
>>
>>
>>
>>
>>
>> --
>> Andrew Solomon
>>
>> Mentor@Geekuni http://geekuni.com/
>> http://www.linkedin.com/in/asolomon
>>
>


-- 
Andrew Solomon

Mentor@Geekuni http://geekuni.com/
http://www.linkedin.com/in/asolomon

Reply via email to