0

2つのファイルを比較したいので、次のコードを記述しました。

while($line1 = <FH1>){
     while($line2 = <FH2>){
         next if $line1 > $line2;
         last if $line1 < $line2;
     }
     next;
}

ここでの私の質問は、外側のループがfile1の次の行に到達してから内側のループに移動すると、内側のwhileステートメントがfile2の最初の行から再度読み取られるか、外側の前の反復で中断したところから続行するかということです。ループ?

ありがとう

4

3 に答える 3

7

すべてのプログラムの開始時に常に use strict、最初に使用する時点ですべての変数を宣言する必要があります。これは特に、コードについて助けを求めている場合に当てはまります。use warnings

ファイル内のすべてのデータは数値ですか? そうでない場合、警告を有効にすると、<and>演算子は一般的な文字列ではなく数値を比較するためのものであることがわかります。

ファイルが完全に読み込まれると、つまり 2 番目のループの条件が終了すると、再度読み込むか、先頭に巻き戻すために使用しwhileない限り、ファイルからデータを読み取ることはできません。openseek

一般に、このような状況では、2 つのファイルのうち小さい方を配列に読み取り、そこからデータを使用する方が適切です。両方のファイルが非常に大きい場合は、何か特別なことを行う必要があります。

どのようなファイル比較をしようとしていますか? 2 つのファイルが同一であること、または 2 番目のファイルのすべてのデータが最初のファイルに表示されること、またはその他のことを確認していますか? 2 つのデータ ファイルの例を示してください。

于 2012-07-13T15:55:53.990 に答える
2

内側のwhileループは、FH2ハンドルから最初の行を読み取ると、ファイルハンドルのすべてのコンテンツを消費しますFH1。あなたが達成したいことを直感的に理解できれば、同じステートメントで両方のハンドルから読み取ることができます。

while ( defined($line1 = <FH1>) && defined($line2 = <FH2>) ) {
    # 'lt' is for string comparison, '<' is for numbers
    if ($line1 lt $line2) {
        # print a warning?
        last;
    }
}
于 2012-07-13T16:57:22.310 に答える
0

内側のループは、FH2 の最後の既知の位置から続行されます。ファイルの先頭から再開する場合は、次のように入力する必要があります。

seek(FH2, SEEK_SET, 0);

内側の前に

seek のドキュメントはperldoc にあります

于 2012-07-13T15:55:45.663 に答える