web-dev-qa-db-ja.com

すでに読み取ったファイルハンドルからの再読み取り

1行ずつ読み取るファイルを開きました。

open(FH,"<","$myfile") or die "could not open $myfile: $!";
while (<FH>)
{
    # ...do something
}

プログラムの後半で、ファイルを再度読み取ろうとします(ファイルをもう一度ウォークスルーします)。

while (<FH>)
{
    # ...do something
}

そして、ファイル内のコントロールがEOFにあり、ファイルの最初の行から繰り返されないかのようであることに気づきました。これはデフォルトの動作ですか?これを回避する方法は?ファイルが大きく、配列としてメモリに保持したくないので、ファイルを閉じて再度開くしかありませんか?

13
rajeev

Seekを使用して、ファイルの先頭に巻き戻します。

seek FH, 0, 0;

または、より冗長であること:

use Fcntl;
seek FH, 0, SEEK_SET;

入力を探す必要がある場合は、フィルターとして使用できないため、ツールの有用性が大幅に制限されることに注意してください。パイプから読み取ることができると非常に便利です。すべての統計の57%が構成されていることを念頭に置いて、入力を求めるプログラムの98%が不必要に構成していることを理解する必要があります。データを2回読み取る必要がないように、データを処理するように非常に努力してください。それが可能であれば、あなたのプログラムははるかに便利になります。

22
William Pursell

いくつかのオプションがあります。

  • ファイルハンドルを再度開きます
  • William Pursellが提案したように、 seek を使用して、ファイルの先頭に位置を設定します。
  • Tie :: File などのモジュールを使用すると、ファイルをメモリにロードせずに配列として読み取ることができます。
5
TLP