2

簡単な質問があります:

最初のコードはファイルの最初の行を出力しないのに、2 番目のコードは出力するのはなぜですか?

#! /usr/bin/perl

use warnings;
use strict;

my $protfile = "file.txt";
open (FH, $protfile);
while (<FH>) {
         print (<FH>);

}

#! /usr/bin/perl

use warnings;
use strict;

my $protfile = "file.txt";
open (FH, $protfile);
while (my $file = <FH>) {
         print ("$file");

}
4

4 に答える 4

3

<> 演算子を使用して最初の行を消費し、印刷で再度使用しているため、最初の行は既になくなっていますが、印刷していません。<> は readline 演算子です。$_ 変数を出力するか、2 番目のコードで行っているように定義済みの変数に代入する必要があります。最初のコードを次のように書き換えることができます。

印刷;

何も指定しない場合、 print は $_ を使用するため、機能します。

于 2013-09-10T17:48:21.143 に答える
2

スカラー コンテキストで使用すると<FH>、ファイルから次の 1 行を返します。

list contextで使用する<FH>と、ファイル内の残りのすべての行のリストを返します。

while (my $file = <FH>)スカラーに割り当てているため、スカラーコンテキストです。 while (<FH>)は の略なwhile(defined($_ = <FH>))ので、スカラー コンテキストでもあります。 print (<FH>);複数の引数を取ることができる関数への引数として使用しているため、リストコンテキストになります。

while (<FH>) {
    print (<FH>);
}

whileパーツは最初の行を読み取ります($_これは二度と使用されません)。次に、printパーツは残りの行を一度にすべて読み取り、それらをすべて再度出力します。次に、while条件が再度チェックされますが、行が残っていないため、1 回の反復で<FH>戻り、ループが終了します。undef

while (my $file = <FH>) {
    print ("$file");
}

おそらく予想以上のことを行います。ループの各反復中に1行を読み取ってから出力します。

ちなみに、print $file;同じことをしますprint ("$file");

于 2013-09-10T17:58:46.280 に答える
1
while (<FH>) {
    print (<FH>);
}

代わりにこれを使用してください:

while (<FH>) {
    print $_;
}
于 2013-09-12T08:03:12.073 に答える