我认为我遇到了 Perl 缓冲问题,因为我需要读取和解析大文本文件(由我自己在前面的代码行中创建)以最终在另一个文件中打印内容。
在某些时候,在读取一个包含 90,855 行的文件和第二个文件的其他一些文件之后,脚本并没有完全读取文件的一行。
我计算了在发生这种情况之前读取的字符数:233,467,因此在读取文件的下一行之前尝试刷新缓冲区并休眠。它不起作用。
请问有什么建议吗?
这是我的代码:
foreach $i (@files) {
my $buff = 0;
print "Analyzing $i\n";
sleep(1);
$program = $1 if $i =~ /(\w+)_SITES/;
open(FIL, $i) or die "$!: $i\n";
while (<FIL>) {
$buff += length($_);
if ($buff >= 230000) { #FLUSH THE BUFFER, NOT WORKING!!!
$buff = 0;
sleep(1);
select((select(FIL), $| = 1)[0]);
}
undef($a);
unless ($. == 1) {
if ($o == 0) {
if (/^\d+\t(\S+)\t(\S+)\t(\d+)\t(\d+)\t(\S+)\t(\S+)\t(.*)/) {
$mirna = $1;
$target = $2;
$start = $3;
$end = $4;
$site = $5;
$comp_p = $6;
$a = $7;
$j = "${mirna}_${target}_${start}_$end";
$site_nu{$j} = "$mirna\t$target\t$start\t$end\t$site\t$comp_p"; # Store each site in a hash
}
else { #DIES HERE!!!
die "$buff characters, in line $.:$_\n"
}
}
else {
if (/^\d+\t(\S+)\t(\S+)\t(\d+)\t(\d+)\t(\S+)\t(.*)/) {
$mirna = $1;
$target = $2;
$start = $3;
$end = $4;
$site = $5;
$a = $6;
$j = "${mirna}_${target}_${start}_$end";
$site_nu{$j} = "$mirna\t$target\t$start\t$end\t$site"; # Store each site in a hash
}
}
它死在“死在这里!!” 死,在读取第二个文件的 3,413 个字符后。
发生这种情况是因为正则表达式不起作用,因为只有一半的行在 $_ 中。