我想我有一個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