in reply to ambiguous regex match

First, you're using the wrong $data variable. Second, as Corion points out, you need to protect with if.

my $data = 'blabla;tag1=12345;blabla;tag2=99999'; my $tag1; my $tag2; $data =~ /tag1=(\d+)/; $tag1 = $1 if $1; $data =~ /tag2=(\d+)/; $tag2 = $1 if $1; # # or # # the '?' in the below regex means it'll grab the closest # tag2, and ignore any beyond it ($tag1, $tag2) = $data =~ /tag1=(\d+).*?tag2=(\d+)/ if $1 && $2; print "$tag1, $tag2";

Update: I could have sworn you were using $2 in the second match. If that was the case and you edited your post, I want to point out that when doing independent matches, the second run to get a match will re-use $1. To use $2, you need both capture groups within a single regex.

Replies are listed 'Best First'.
Re^2: ambiguous regex match
by Laurent_R (Canon) on Jul 24, 2015 at 17:07 UTC
    $data =~ /tag2=(\d+)/; $tag2 = $1 if $1;
    I am afraid this will not work correctly if the regex fails, because $1 will still be set to its previous value (previous regex match). So that rather than testing $1, we should test whether the regex matched.

    I think that you would need rather something like this:

    $tag1 = $1 if $data =~ /tag1=(\d+)/; $tag2 = $1 if $data =~ /tag2=(\d+)/;