0

我知道搜索一般是如何工作的,并且看过其他一些帖子。但是我仍然很困惑。Seek 究竟是如何工作的,它会从它离开的相同位置读回吗?

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

这会回到第一个循环并从它停止的地方开始......?然后如果它回到第二个while循环,我如何让它从它停止的地方读取......?

4

3 回答 3

3

不,它不会去任何地方。这seek是一个无操作,因为根据seek文档,您实际上是在告诉它“从当前位置移动 0 个字节”。如果您需要记下您在文件中的位置,然后从那里恢复,您需要使用然后tell设置为( ) 来获取它。seekWHENCESEEK_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

只要您不在循环中打开或关闭它们,句柄就会从它们最初停止的位置“返回” - 而您没有。

如果您要做的是停止从第二个输入读取并从第一个输入读取,那么您只想打破内部循环。因为您没有关闭或重新启动 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它只是在文件中设置下一个数据将被读取的位置。我在我的解决方案中使用它来在文件被完全读取后将读取点返回到文件的开头。

为了让我们为您提供最好的帮助,您必须重新表述您的问题,并详细说明您真正想做的事情。目前,我最好的猜测是这个。

你有两个文件,每个文件都有四行记录,第二行有一个 DNA 序列。您想要一个出现在两个文件中任何位置的所有 DNA 序列的列表,以及仅在一个文件中或另一个文件中的那些序列的列表。

无论这是否正确,请提出一个新问题,详细解释您的问题。您已经寻求无法解决您的问题的特定解决方案,并寻求帮助以使其正常工作。如果您告诉我们问题而不是您提出的解决方案,那么我们将能够更好地帮助您,并且不必对真实情况进行猜测。

于 2012-06-05T18:42:14.007 回答