Я думаю, что у меня проблема с буферизацией в Perl, так как мне нужно читать и анализировать большие текстовые файлы (созданные мной в предыдущих строках кода), чтобы, наконец, распечатать вещи в другом файле.Подозрительная проблема буферизации 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 символов второго файла.
Это происходит потому, что регулярное выражение не работает, так как только половина строки находится в $ _.
Этот сценарий является одним поточным? – Glenn
Переменная '$ |' управляет автоматической очисткой * выходных файлов * после каждого выражения 'print'. Он не влияет на входные файлы, а сброс входного файла не имеет смысла. – Borodin
Если вы пытаетесь прочитать файл с разделяемой вкладкой, вы можете взглянуть на ['Text :: CSV'] (http://search.cpan.org/perldoc?Text%3A%3ACSV). Вы также должны добавить 'use strict; использовать предупреждения, 'к этому скрипту и исправить ошибки/предупреждения. Затем перепишите код, чтобы уменьшить масштаб всех переменных до минимально возможного, используя ключевое слово 'my'. – TLP