0

私はシークが一般的にどのように機能するかを知っており、他のいくつかの投稿を見てきました。しかし、私はまだ混乱しています。シークはどのように正確に機能しますか?中断したのと同じ位置から読み返すでしょうか?

while( my $line= <IN1>)
{
  do something;
  while( my $l= <IN2>)
  {
    do something;
    seek IN1, 0, 1;
  }
}

これは最初のループに戻って、中断したところから開始しますか? そして、2番目のwhileループに戻った場合、中断したところから読み取るにはどうすればよいですか...?

4

3 に答える 3

3

いいえ、どこにも行きません。ドキュメントによると、「現在の位置から0バイトを移動する」ように効果的に指示しているため、これseekはノーオペレーションです。ファイル内の位置をメモしてから再開する必要がある場合は、それを取得してから( )に設定する必要があります。seektellseekWHENCESEEK_SET0

例:

use Fntl qw(SEEK_SET); # <- he knows exactly what SEEK_SET is on your system, though it is always 0, AFAIR.
    
my $current_position = tell $file_handle;
do_stuff_with_data_from(<$file_handle>);
do_more_stuff_with_data_from(<$file_handle>);
# rewind
seek $fh, $current_position, SEEK_SET;
于 2012-06-05T17:21:53.453 に答える
2

ハンドルは、ループ内で開いたり閉じたりしない限り、最初に中断したところから「戻る」ことになります。

2番目の入力からの読み取りを停止し、最初の入力からの読み取りを実行したい場合は、内側のループから抜け出します。IN2を閉じたり再起動したりしなかったため、前に読んだレコードの後に​​レコードを読み取る準備ができているはずです。

RCD_FROM_1:
while( my $line= <IN1>)
{
  do something;
  RCD_FROM_2:
  while( my $l= <IN2>)
  {
    do something;
    last RCD_FROM_2 if some_condition();
  }
}

あなたもそれを作ることができますnext RCD_FROM_1;

tell行を再読み取りできるようにしたい場合は、すべてのループの最後にaを記録して、巻き戻してその記録を再度読み取ることができるようにすることができます。

my $prev = 0;
RCD_FROM_1:
while( my $line= <IN1>)
{    
  ...

  $prev = tell( IN2 );
  RCD_FROM_2:
  while( my $l= <IN2>)
  {
    do something;
    if ( some_condition()) { 
        die 'Could not reset handle' unless seek( IN2, $prev, 0 );
        last RCD_FROM_2;
    }
    $prev = tell( IN2 );
  }

私自身、おそらく両方のストリームの最後のレコードをローカルにバッファリングしたいと思います。

于 2012-06-05T17:41:25.333 に答える
2

ファイルを巻き戻して最初から読み直していた以前の質問に対する私の答えから、あなたは混乱していると思います。seek

Perl のものはループseekとは何の関係もありません。while次のデータが読み込まれるファイル内の位置を設定するだけです。私は自分のソリューションでそれを使用して、ファイルが完全に読み取られたら、読み取りポイントをファイルの先頭に戻しました。

私たちがあなたに最善を尽くすためには、あなたの質問を言い換えて、あなたが実際にやろうとしていることについての詳細を含める必要があります. 現時点で、私の最良の推測はこれです。

2 つのファイルがあり、それぞれに 4 行のレコードがあり、2 行目に DNA 配列があります。両方のファイルに含まれるすべての DNA 配列のリストと、どちらか一方のファイルにのみ含まれる配列のリストが必要です。

それが正しいかどうかにかかわらず、問題を詳細に説明する新しい質問を提起してください。あなたは、問題を解決しない特定の解決策を探し、それを機能させるために助けを求めました。提案された解決策ではなく問題について教えていただければ、実際の状況について推測する必要がなくなり、より適切なサポートを提供できます。

于 2012-06-05T18:42:14.007 に答える