I want to skip to the first line that contains "include".
<> until /include/;
Why does this not work?
The match operator defaults to using $_
but the <>
operator doesn't store into $_
by default unless it is used in a while loop so nothing is being stored in $_
.
From perldoc perlop
:
I/O Operators ... Ordinarily you must assign the returned value to a variable, but there is one situation where an automatic assignment happens. If and only if the input symbol is the only thing inside the conditional of a "while" statement (even if disguised as a "for(;;)" loop), the value is auto‐ matically assigned to the global variable $_, destroying whatever was there previously. (This may seem like an odd thing to you, but you’ll use the construct in almost every Perl script you write.) The $_ vari‐ able is not implicitly localized. You’ll have to put a "local $_;" before the loop if you want that to happen. The following lines are equivalent: while (defined($_ = )) { print; } while ($_ = ) { print; } while () { print; } for (;;) { print; } print while defined($_ = ); print while ($_ = ); print while ; This also behaves similarly, but avoids $_ : while (my $line = ) { print $line }
<>
is only magic in a while(<>)
construct. Otherwise it does not assign to $_
, so the /include/
regular expression has nothing to match against. If you ran this with -w
Perl would tell you:
Use of uninitialized value in pattern match (m//) at ....
You can fix this with:
$_ = <> until /include/;
To avoid the warning:
while(<>)
{
last if /include/;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With