0

典型的なファイルハンドルの代わりに、私は次のことに慣れています:

open INPUT, $input;
while ($line = <INPUT>) {
    ....
}
close INPUT;

ファイル内の行へのポインターを取得して、これらのポインターをいつでも進めることができるようにするにはどうすればよいですか? 対応するソート済みファイルへの 2 つのポインターを作成して、一方のファイルの行が他方の行よりも「小さい」か「大きい」かに基づいてポインターを進めることができるようにしようとしています。

注: 入力ファイルが BIG であると仮定します。

4

3 に答える 3

7

私があなたのことを正しく理解していれば、

perldoc -f tell

tell行を読み取る直前、行の開始位置を取得する必要があることに注意してください。

与えられた位置に戻る機能はseekです。

あるいは、Tie::Fileを使用すると、ファイルを行の配列として扱うことができ、舞台裏で巧妙な管理が行われます。

于 2011-01-18T18:14:47.940 に答える
0

私のコメントへの答えを考えると、ロジックを次のようなものに修正する必要があります (疑似コード):

open Master;
open Transaction;

# Get initial records?
read first Master;
read first Transaction;

BATCH_LOOP:
while (!eof(Master) && !eof(Transaction))
{
     while (Master.ID < Transaction.ID && !eof(Master))
     {
           write Master;
           read next Master;
     }
     if (Master.ID > Transaction.ID)
     {
           report Missing Master for Transaction;
           read next Transaction;
           next BATCH_LOOP;
     }
     # Master.ID == Transaction.ID
     Update Master from Transaction;
     read next Transaction;
}

# At most one of the following two loop bodies is executed
while (!eof(Master))
{
     read next Master;
     write Master;
}

while (!eof(Transaction))
{
     Report Missing Master;
     read next Transaction;
}

ロジックを 2 回 (および 3 回) チェックしてください。しかし、それはあなたが必要とするものに近いです。

レキシカル ファイル ハンドルを使用します。

open my $master, "<", $master_file or die "Failed to open master file $master_file ($!)";
open my $trans,  "<", $trans_file  or die "Failed to open transaction file $trans_file ($!)";

それらは互いに独立して読むことができます。

于 2011-01-18T21:10:51.133 に答える
0

なぜ配列に格納しないのですか?

my @lines1 = <INPUT1>;
my @lines2 = <INPUT2>;

ysth の seek/tell 提案の例を次に示します。これは、ファイルが大きすぎる場合に必要になる可能性があります

于 2011-01-18T18:15:17.223 に答える