[pm-h] Discussion about delimiters for m//

Reini Urban reini.urban at gmail.com
Fri Feb 14 22:00:03 PST 2014


On Feb 14, 2014, at 5:55 PM, G. Wade Johnson <gwadej at anomaly.org> wrote:

Near the end of the meeting last night, there was a minor discussion at
the whiteboard about which characters Perl allows as delimiters on the
match operator.

According to PerlDoc:

If "/" is the delimiter then the initial "m" is optional.  With the
"m" you can use any pair of non- whitespace (ASCII) characters as
delimiters.  This is particularly useful for matching path names that
contain "/", to avoid LTS (leaning toothpick syndrome).  If "?" is the
delimiter, then a match-only- once rule applies, described in
"m?PATTERN?" below.  If "'" is the delimiter, no interpolation is
performed on the PATTERN.  When using a character valid in an
identifier, whitespace is required after the "m".

So, that means that

  $str =~ m mabc+m;

is valid Perl and it matches "abc+".

Weird. I can't think of a real use for it and using it in production
code is likely to get you beaten by whoever maintains your code.

 Me neither.

This is how to test it, with a debugging perl

$ perl -Dr -e'print "abc" =~ m mabc+m;'

Compiling REx "abc+"

rarest char c at 0

rarest char b at 1

Final program:

   1: EXACT <ab> (3)

   3: PLUS (6)

   4:   EXACT <c> (0)

   6: END (0)

anchored "abc" at 0 floating "c" at 2..2147483647 (checking anchored)
minlen 3

Omitting $` $& $' support.

EXECUTING...

Guessing start of match in sv for REx "abc+" against "abc"

Found anchored substr "abc" at offset 0...

Found floating substr "c" at offset 2...

Guessed: match at offset 0

Matching REx "abc+" against "abc"

   0 <> <abc>                |  1:EXACT <ab>(3)

   2 <ab> <c>                |  3:PLUS(6)

                                  EXACT <c> can match 1 times out of
2147483647...

   3 <abc> <>                |  6:  END(0)

Match successful!

1Freeing REx: "abc+"

B::Concise shows you the match operator b

$ perl -MO=Concise -e'print "abc" =~ m mabc+m;'

7  <@> leave[1 ref] vKP/REFC ->(end)

1     <0> enter ->2

2     <;> nextstate(main 1 -e:1) v:{ ->3

6     <@> print vK ->7

3        <0> pushmark s ->4

5        </> match(/"abc+"/) lKS/RTIME ->6

4           <$> const(PV "abc") s ->5

-e syntax OK
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/mailman/private/houston/attachments/20140215/ba49726f/attachment.html>


More information about the Houston mailing list