如果模式在文件中匹配,则在几秒钟内完成查找...如果模式不存在则需要一个小时才能退出循环

时间:2015-07-28 11:51:17

标签: perl

open(FH,"some.txt") or die("\nFile not found\n");
my $find;
while(<FH>)
{
     ($find) = $_ =~m/^(scaffold110132\s+6126\s+C\b\s+.+?)(?=\n|$)/;
     print "\n***$find***\n" if ($find);
     last if($find);

}

这是在some.txt文件中查找模式的一小段代码。如果模式存在,Perl会立即出现。然而,如果模式不存在,则代码需要一个小时才能退出循环。有人可以帮我解释原因吗?

some.txt :: size :: 45Gb 内容摘录::

scaffold110637  42  A   1   ^!. C
scaffold110637  43  A   1   .   C
scaffold110637  44  T   1   .   C
scaffold110637  45  A   1   .   F
scaffold110637  46  T   1   .   F
scaffold110637  47  T   1   .   F
scaffold110637  48  A   1   .   F
scaffold110637  49  C   1   .   F
scaffold110637  50  A   1   .   H
scaffold110637  51  C   1   .   H

1 个答案:

答案 0 :(得分:0)

我非常强烈怀疑当循环持续很长时间时,文件中的一行以scaffold110132开头,然后几乎与正则表达式匹配,但不完全匹配。我怀疑你的脚本卡在这一行上。也就是说,我怀疑它不是“模式不在文件中”的问题,而是“与正则表达式不匹配但速度慢的行”之一。

我必须承认,我不确定哪种行可以做到这一点 - 您的行以\n字符结尾,还是以\r\n结尾?

但是,我建议两件事:

首先,尝试这个,因为找不到行时可能会更快:(并找到相同的行)

open(FH,"some.txt") or die("\nFile not found\n");
my $find;
while(<FH>)
{
     next unless /^scaffold110132/;
     ($find) = $_ =~ m/^(scaffold110132\s+6126\s+C\s.+)/;
     print "\n***$find***\n" if ($find);
     last if($find);
}

虽然因为我们中的一些人仍然对这么长时间的事情感到好奇,你能不能尝试一下并告诉我们输出是什么?

use Time::Hires qw( time );
use Data::Dumper;

open(FH,"some.txt") or die("\nFile not found\n");
my ($find, $start, $end);
my $maxtime = 0.0;
my $slowline = '';
while(<FH>)
{
     $start = time;
     ($find) = $_ =~m/^(scaffold110132\s+6126\s+C\b\s+.+?)(?=\n|$)/;
     print "\n***$find***\n" if ($find);
     $end = time;
     if ($end - $start > $maxtime) {
         $slowline = $_;
         $maxtime = $end - $start;
     }
     last if($find);
}
print Data::Dumper->Dump([$maxtime, $slowline], [qw($maxtime $slowline)]);