我想我有一个Perl缓冲问题,因为我需要读取和解析大文本文件(由我自己在代码的以前的行中创建)来最终在另一个文件中打印文件。可疑的Perl缓冲问题
在某个点,读取与90855行的文件和其他一些该第二文件的后,该脚本不读取行的文件的完全。
我已读计数的字符数,直到发生这种情况:233467,并且因此试图读取文件的下一行之前以冲洗缓冲液和睡眠。它不起作用。
有什么建议吗?
这里是我的代码:
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个字符之后死亡。
这是因为正则表达式不起作用,因为只有一半的行在$ _中。
该脚本是单线程的吗? – Glenn
变量'$ |'控制每个'print'语句后自动刷新*输出文件*。它对输入文件没有影响,并且输入文件的刷新没有意义。 – Borodin
如果您试图读取一个制表符分隔的文件,您可以查看['Text :: CSV'](http://search.cpan.org/perldoc?Text%3A%3ACSV)。你还应该加上'use strict;使用警告;'到这个脚本并修复错误/警告。然后重写代码,使用'my'关键字将所有变量的范围缩小到最小。 – TLP