0

ここでPerl を学習しようとしていますが、チュートリアルでは、ファイルを読み取った後に次のコード スニペットを提案しています。

my $team_number = 42;
my $filename = 'input.txt';

open(my $fh, '<', $filename) or die "cannot open '$filename' $!";

my $found;
while(<$fh>) {
  chomp;
  last if($_ eq "Team $team_number");
}
die "cannot find 'Team $team_number'" if(eof $fh);

しかし、なぜchompが必要なのかよくわかりません。chomp は新しい行を削除します。各ループで、行末の新しい行を削除しますが、なぜでしょうか? chomp を削除すると、スクリプトはエラーをスローしますが、その理由はわかりません。

chomping が何をするかは理解していますが、すでにすべての行をループしているため、一致させる必要がある理由がわかりませんでした。なぜ新しい行を削除する必要があるのでしょうか? Kallol の投稿を読んだ後で初めて、ループされた実際の文字列は Team 42\n であるため、chomped しないと eq が失敗することに気付きました。そのため、私の質問は他の chomp の質問とは異なります。自分のコードが chomp なしでは機能しない理由がわかりませんでしたが、誰かが私を正しい方向に向けてくれました。

4

3 に答える 3

2

テキストを読み込んで作業しているときに、新しい行が必要ないのは理にかなっています。新しい行は、テキストをファイルに編成します。メモリには、配列またはその他のデータ構造があります。あなたはそれを する必要はありませんchomp、あなたは一般的にしたいです.

KallolSobriquechompによって説明されているコードなしで意図したとおりにコードが実行されない理由: 一致しない改行 (改行のない文字列) が残っているため、ファイルは最後まで読み取られて返されます。真実。chomp (または)を参照してください 。あなたが言うように、スクリプトが「エラーをスローする」ことはわかりません。「chomp」の有無にかかわらず、私には合いません。それは決して一致しません。$_eofperldoc -f chomp

123chompで指摘されているように、 にも別のエラーがあります: 一致する文字列がファイルの最後の行である場合、一致が見つかるまでにファイルが読み取られているため、true を返し、文字列がそうではなかったというステートメントを取得します。見つかった。たとえば、(すぐそこにある)フラグを使用して修正できること。その場合、これ以上決定することはありません。eofeof

あなたが今持っているものは少しねじれた(そしてかなり壊れやすい!)ロジックを持っているので、それはとても良いことです.

于 2016-02-17T09:08:02.630 に答える
2

チョップしない場合は、一致を変更して新しい行を含める必要があります。

while(<$fh>) {
  last if($_ eq "Team $team_number\n");
}
于 2016-02-17T09:10:10.280 に答える
0

Chomp は、ファイルの各行をループするときに、行末から改行文字を削除します。行を改行なしのテキストと一致させているため、一致が見つからず、ファイルは最後まで読み取られます。したがって、End-Of-File をチェックする最後の条件が true であり、「die」ステートメントが実行されます。

于 2016-02-17T09:48:14.967 に答える