1

3 つのファイルを読み取り、それぞれのファイルを読み取った後に新しいファイルを書き込む Perl スクリプトがあります。すべてが 1 つのスレッドです。

このスクリプトでは、3 つのテキスト ファイルを開いて操作し、内容をハッシュに保存します。ファイルが大きい (3 MB 近く)。

ループを使用して各ファイルを処理しています (開く -> 読み取り -> アクションを実行 (ハッシュ テーブル) -> 閉じる)

最初のファイルをスキャンしているときに、Cygwin シェルの Perl ターミナル ウィンドウが動かなくなることに気付きました。Enter キーを押した瞬間に、スクリプトが残りのファイルを問題なく処理していることがわかります。

私のスクリプトには STDIN からの読み取りがないため、非常に奇妙です。さらに、すべてが同じループ内にあるため、3 つのファイルすべてに同じロジックが適用されます。

ここで誰かが同様の問題に直面しましたか? これは通常、大きなファイルや大きなハッシュを処理するときに発生しますか?

ここにスクリプトを投稿することはできませんが、投稿する内容はあまりありません。これは私の Cygwin シェルの問題でしょうか?

この問題が解決しない場合、どうすれば回避できますか? スクリプトの進行中にエンター入力を提供するようなものですか? さらに重要なことに、このような問題をどのようにデバッグできますか?

sub read_set
{
@lines_in_set = ();
push @lines_in_set , $_[0];
while (<INPUT_FILE>) 
    {   $line = $_;
          chomp($line);
          if ($line=~ /ENDNEWTYPE/i or $line =~ /ENDSYNTYPE/ or eof())
          {
          push @lines_in_set , $line;
          last;
          }
          else 
          {
          push @lines_in_set , $line;       
          }
    }
    return @lines_in_set;
}

--------> 私は問題を見つけたと思います :- または eof() 呼び出しは、スクリプトが動かなくなることを保証していました!! なんとなく初回だけハプニング。理由はわかりませんが

4

1 に答える 1

2

eof()呼び出しが問題です。を参照してくださいperldoc -f eof

eof空の括弧付きは、を介してアクセスされる疑似ファイルを指しますwhile (<>)。これは、で指定されたすべてのファイルで構成されるか、存在@ARGVSTDINない場合はを指します。

そして特に:

この関数は実際に文字を読み取り、それを「ungetc」するため、インタラクティブなコンテキストでは役に立たないことに注意してください。

ただし、ループは、と呼ばれる別のハンドルから読み取りますINPUT_FILE

を呼び出す方が理にかなっていますeof(INPUT_FILE)。しかし、それでもおそらく必要ではありません。外側のループは、の終わりに達すると終了しますINPUT_FILE

あなたが見ている症状に関係のない、いくつかのより多くの提案:

追加

use strict;
use warnings;

スクリプトの上部近くにあり、これによって生成されるエラーメッセージを修正します(perl -cw script-nameコンパイルのみのチェックを実行します)。my( )を使用して変数を宣言する必要がありますperldoc -f my。そして、一貫したインデントを使用します。ほとんどのPerlドキュメントにあるのと同じスタイルをお勧めします。

于 2012-08-01T00:50:01.820 に答える