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, |
In reply to Re^5: Regex match on implicit default variable ($_) in a script, not a one liner
by Athanasius
in thread Regex match on implicit default variable ($_) in a script, not a one liner
by Todd Chester
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |