「include」を含む最初の行にスキップしたい。
<> until /include/;
これが機能しないのはなぜですか?
match 演算子のデフォルトは usingです$_
が、 while ループで使用されない限り、<>
演算子はデフォルトでに格納されないため、 には何も格納されません。$_
$_
からperldoc perlop
:
I/O 演算子 ... 通常は戻り値を変数に代入する必要がありますが、 は、自動割り当てが発生する状況の 1 つです。場合に限り 入力記号は、「while」の条件内の唯一のものです ステートメント ("for(;;)" ループに偽装されていても) の場合、値は auto- グローバル変数 $_ に動的に割り当てられ、 以前そこに。(これは奇妙に思えるかもしれませんが、 あなたが書くほぼすべての Perl スクリプトでこの構文を使用してください。) $_ 変数 able は暗黙的にローカライズされていません。「ローカル $_;」を配置する必要があります。 あなたがそれをしたい場合は、ループの前に。 次の行は同等です。 while (defined($_ = )) { 印刷; } while ($_ = ) { print; } while () { 印刷; } (;;) {印刷; } print while defined($_ = ); 印刷しながら ($_ = ); しながら印刷します。 これも同様に動作しますが、 $_ を避けます: while (my $line = ) { print $line }
<>
構成内の魔法にすぎませんwhile(<>)
。それ以外の場合は に割り当てられない$_
ため、/include/
正規表現には一致するものがありません。これを-w
Perl で実行すると、次のように表示されます。
Use of uninitialized value in pattern match (m//) at ....
これは次の方法で修正できます。
$_ = <> until /include/;
警告を回避するには:
while(<>)
{
last if /include/;
}