大きなテキスト ファイル (コードの前の行で自分で作成したもの) を読み取って解析し、最終的に別のファイルに出力する必要があるため、Perl のバッファリングの問題が発生していると思います。
ある時点で、90,855 行のファイルと 2 番目のファイルの他のファイルを読み取った後、スクリプトはファイルの行を完全に読み取っていません。
これが発生するまでに読み取られた文字数を数えたところ、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
}
}
「DIES HERE!!」で死ぬ。2 番目のファイルの 3,413 文字を読み取った後、死亡します。
行の半分しか $_ にないため、正規表現が機能しないために発生します。