in reply to Re^3: Regex match on implicit default variable ($_) in a script, not a one liner
in thread Regex match on implicit default variable ($_) in a script, not a one liner

I am now able to exclude and reform $B, but I can't do it the other way (include only "def"). Isn't "while" suppose to be the opposite of "until"?

#!/usr/bin/perl use strict; use warnings; use diagnostics; my $B = ""; my $A = "abc def ghi "; while ( $A =~ m{(.+)}g ) { $B .= "$1\n" unless $1 =~ /def/; } print "\$B = \n$B\n"; $B = ""; while ( $A =~ m{(.+)}g ) { $B .= "$1\n" while $1 =~ /def/; } print "\$B = \n$B\n";

$B =

abc

ghi

Use of uninitialized value $_ in pattern match (m//) at ./ExtractTest.pl line 21 (#1)

Now what am I doing wrong?

  • Comment on Re^4: Regex match on implicit default variable ($_) in a script, not a one liner
  • Download Code

Replies are listed 'Best First'.
Re^5: Regex match on implicit default variable ($_) in a script, not a one liner
by Athanasius (Cardinal) on Oct 24, 2015 at 06:20 UTC
    Isn't "while" suppose to be the opposite of "until"?

    Yes, but you want the “opposite” (actually, the negation) of unless, which is simply if. See perlsyn#Statement-Modifiers.

    But there is another problem: $1 refers to the first capture in the most recent regular expression match. In the expression:

    $B .= "$1\n" unless $1 =~ /def/;

    the concatenation $B .= "$1\n" occurs only if the regex match $1 ~ /def/ fails; in which case, there is no match, so the most recent match is still the one from the while loop regex. But in the expression:

    $B .= "$1\n" if $match =~ /def/;

    the concatenation occurs only if the new match succeeds; in which case, $1 is overwritten. You can fix this by assigning the value of $1 to a temporary variable:

    while ($A =~ m{(.+)}g) { my $capture = $1; $B .= "$capture\n" if $capture =~ /def/; }

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,