Chcę przejść do pierwszego wiersza zawierającego "uwzględnij".Jak przejść do konkretnej linii wejściowej w Perlu?
<> until /include/;
Dlaczego to nie działa?
Chcę przejść do pierwszego wiersza zawierającego "uwzględnij".Jak przejść do konkretnej linii wejściowej w Perlu?
<> until /include/;
Dlaczego to nie działa?
Domyślne operator pasujące do korzystania $_
ale operator <>
nie przechowuje na $_
domyślnie, chyba że jest on stosowany w pętli while, więc nic nie jest przechowywane w $_
.
Od 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 }
<>
jest tylko magia w while(<>)
konstruktu. W przeciwnym razie nie przypisze to $_
, więc wyrażenie regularne /include/
nie ma nic do dopasowania. Jeśli ten prowadził z -w
Perl powie ci:
Use of uninitialized value in pattern match (m//) at ....
Można to naprawić z:
$_ = <> until /include/;
Aby uniknąć ostrzeżenie:
while(<>)
{
last if /include/;
}
naprawdę? nie mam pojęcia. dzięki – user44511
Ja nie. Dlaczego <> zachowuje się inaczej, gdy nie ma pętli? – Kip
To skrót, dzięki czemu można powiedzieć "while (<>) {...}" zamiast "while (defined ($ _ = <>)) {...}". –