2011-01-18 11 views
0

に扱う私がするために使用していますか?対応するの2つのポインタを作成して、ファイルを作成しようとしているので、あるファイルの行が他の行の行よりも「小さい」か「大きい」かに基づいてポインタを進めることができます。ファイルは、代わりに、一般的なファイルハンドルをPerlの

注:入力ファイルはBIGです。私が正しくあなたを理解していれば

+1

本当に後ろに行く必要がありますか?それぞれを進めることができるように、2つの別々のハンドルが必要ですか?これは古典的なトランザクション処理コード(バッチスタイル)のように聞こえます。関連するトランザクションレコードを読み込み、変更を適用し、新しいマスタを書き込む。あるいは、 'comm'がPerlで再実装されたようなものです。 –

+0

私は後ろに行く必要はないし、私はそれを暗示していないことを願っています。実際、問題のあなたの記述は、質問に対する私の元の意図と一致します。 – syker

答えて

7

、あなたが行の開始位置を取得するためにラインを読ん前tellだけにしたい

perldoc -f tell

注意。

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

また、Tie::Fileを使用すると、ファイルを行の配列として扱い、舞台裏で賢明な管理を行うことができます。

0

は私のコメントへの答えを考えると、あなたはあなたを修正する必要があります。ここでは

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

はのはおそらくより多くのファイルが大きすぎる場合は何をしたいです/ TELL提案を、求めるysthの例です - それは気晴らしの周りの場で書かれていた

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; 
} 

ダブル(トリプル)ロジックをチェックします(擬似コード)のようなものへのロジック。しかし、それはあなたが必要とするものに近いです。

使用字句ファイルハンドル:

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 ($!)"; 

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

+0

涼しい、単調なオープン! :) – tchrist

+0

@tchrist:次はすべての場所に - 偉大なもの、Pコード! DWIMmeryの究極の... –

関連する問題