in reply to how to find particular string and store in to variable

What have you tried? Are all of your lines going to be exactly the same with an integer at the end of the line?

#!/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";

-stevieb

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

    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"; }

      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 ...

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

Re^2: how to find particular string and store in to variable
by AnomalousMonk (Archbishop) on Jun 25, 2015 at 13:38 UTC

    Assuming, as you do, the extraction of a group of digits at the absolute end of a string, the  .*\/ portion of the regex is unnecessary (although it does no harm), as is the subsequent
        my $var = $1 || '';
    capture/fixup statement. (Update: But see also the reply of 1nickt below.) An alternative would be:

    c:\@Work\Perl\monks>perl -wMstrict -le "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 qq{'$s' -> '$var'}; } " 'http://172.20.37.115:8080/se/1.0/pro/subs/198968' -> '198968' 'http://172.20.37.115.8080/se/1.0/pro/123456/' -> ''
    with the regex expression  m{ \d* \z }xmsg (note the added  /g modifier) also working.


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