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
答案 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)]);