in reply to Re^2: how to find particular string and store in to variable
in thread how to find particular string and store in to variable

But I was matching against  (\d*) \z which cannot fail, although it could match an empty string of digits — which can be useful in and of itself!

Update: Interestingly, what is captured | assigned to  $var in a statement like
    my ($var) = $s =~ m{ (\d+) \z }xms;
is not the same as what is captured to | not necessarily the same as the value of $1:

c:\@Work\Perl\monks>perl -wMstrict -le "'zot' =~ m{ (zot) }xms; ;; for my $s ( 'http://172.20.37.115:8080/se/1.0/pro/subs/198968/', 'http://172.20.37.115.8080/se/1.0/pro/123456', ) { my ($var) = $s =~ m{ (\d+) \z }xms; print '$var is ', defined($var) ? '' : 'UN', 'defined'; print qq{'$s' -> '$var' (\$1 is '$1')}; } " $var is UNdefined Use of uninitialized value $var in concatenation (.) or string at -e l +ine 1. 'http://172.20.37.115:8080/se/1.0/pro/subs/198968/' -> '' ($1 is 'zot' +) $var is defined 'http://172.20.37.115.8080/se/1.0/pro/123456' -> '123456' ($1 is '1234 +56')
This warrants a bit more research!


Give a man a fish:  <%-(-(-(-<

Replies are listed 'Best First'.
Re^4: how to find particular string and store in to variable
by 1nickt (Canon) on Jun 25, 2015 at 14:16 UTC

    Interestingly, what is captured to $var in a statement like

    my ($var) = $s =~ m{ (\d+) \z }xms;

    is not the same as what is captured to $1:

    Isn't that just because the RE didn't match the first time through the loop, so $1 still held 'zot' ?

    If your RE did match the first time through, $1 would have been reset and would therefore match $var ...

      Isn't that just because the RE didn't match the first time through the loop ...

      Yes, and I've clarified the language used above a bit. But I still find the difference interesting: a potential pitfall.


      Give a man a fish:  <%-(-(-(-<

        Anomalous, yes, it is a definite potential pitfall, one into which I have fallen myself. But like many a Perl pitfall, one you are likely to avoid thereafter!

        I can't remember how it was I screwed myself, but I do remember that I started to test whether a RE matched before using a backreference EVERY time thereafter!

        Typically obtuse tchrist documentation in perlre provided the "cluebat" when I eventually found it:

        The numbered match variables ($1, $2, $3, etc.) and the related punctuation set ($+ , $& , $` , $' , and $^N ) are all dynamically scoped until the end of the enclosing block or until the next successful match, whichever comes first. (See Compound Statements in perlsyn.)

        NOTE: failed matches in Perl do not reset the match variables, which makes it easier to write code that tests for a series of more specific cases and remembers the best match.

        (emphasis added)

        So yeah, it's interesting, but documented. Not that that keeps me out of every pitfall I encounter!

Re^4: how to find particular string and store in to variable
by 1nickt (Canon) on Jun 25, 2015 at 14:13 UTC

    Anomalous, sorry, my comment was not in response to yours, but to the one above it by Stevieb :-)

      ... you'd want that RE within an if condition ... to ... Stevieb ...

      Ah! In that case, it's a very good point! I hadn't noticed it myself.


      Give a man a fish:  <%-(-(-(-<