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

I think you'd want that RE within an if condition, because otherwise the RE could fail to match and you'd load the previous value of $1 into $var

#!/usr/bin/perl use warnings; use strict; my $str = "http://172.20.37.115:8080/se/1.0/provision/subscribers/1989 +68"; $str =~ /.*\/(\d+)$/; my $var = $1 || ''; print "$var\n"; # prints 198968 my $str2 = http://172.20.37.115:8080/se/1.0/provision/subscribers/foo" +; $str2 =~ /.*\/(\d+)$/; my $var2 = $1 || ''; print "$var2\n"; #prints 198968

May be better to do:

use warnings; use strict; my $str = "http://172.20.37.115:8080/se/1.0/provision/subscribers/1989 +68"; if( $str =~ /.*\/(\d+)$/ ) { my $var = $1 || ''; print "$var\n"; }

Replies are listed 'Best First'.
Re^3: how to find particular string and store in to variable
by AnomalousMonk (Archbishop) on Jun 25, 2015 at 13:58 UTC

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

      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, 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:  <%-(-(-(-<