in reply to Re^2: 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

Hello Todd,

Here’s another approach, using the /g modifier in scalar context and relying on the fact that . in a regex matches any character except a newline:

use strict; use warnings; my $A = "abc\ndef\nghi\n"; while ($A =~ /(.+)/g) { print "$1\n" unless $1 =~ /def/; }

Output:

13:59 >perl 1419_SoPW.pl abc ghi 14:00 >

Hope that helps,

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

Replies are listed 'Best First'.
Re^4: Regex match on implicit default variable ($_) in a script, not a one liner
by Todd Chester (Scribe) on Oct 24, 2015 at 05:15 UTC

    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?

      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,

Re^4: Regex match on implicit default variable ($_) in a script, not a one liner
by Todd Chester (Scribe) on Oct 24, 2015 at 04:52 UTC

    I am trying to create a multiline $B from $A. How do I reassemble $B?