5

「include」を含む最初の行にスキップしたい。

<> until /include/;

これが機能しないのはなぜですか?

4

2 に答える 2

10

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 }
于 2008-12-11T17:46:28.520 に答える
4

<>構成内の魔法にすぎませんwhile(<>)。それ以外の場合は に割り当てられない$_ため、/include/正規表現には一致するものがありません。これを-wPerl で実行すると、次のように表示されます。

Use of uninitialized value in pattern match (m//) at ....

これは次の方法で修正できます。

$_ = <> until /include/;

警告を回避するには:

while(<>)
{
    last if /include/;
}
于 2008-12-11T17:51:41.817 に答える