Perl 未观察到FH的输出,同时显示相同的标准输出

Perl 未观察到FH的输出,同时显示相同的标准输出,perl,Perl,大家早上好,我需要一些帮助 我有这样一种代码的和平: open $fh, ">", "./results_BLAST_adjacentgenes_samehit.txt" or die "Could not write the file."; print "Validating...\n"; $counter = 0; for $key (keys %hash4000) { for $hit1 (@{$hash4000{$key}}) { for $hit2 (@{

大家早上好,我需要一些帮助

我有这样一种代码的和平:

open $fh, ">", "./results_BLAST_adjacentgenes_samehit.txt" or die "Could not write the file.";
print "Validating...\n";
$counter = 0;
for $key (keys %hash4000) {
    for $hit1 (@{$hash4000{$key}}) {
        for $hit2 (@{$hash4000{$key}}) {
            $text = $hit1."\t".$hit2."\t".$key."\n";
            next if $text ~~ @array; push @array, $text;
            if ($chromosome{$transc{$hit1}} eq $chromosome{$transc{$hit2}} and $transc{$hit1} ne $transc{$hit2}) {
                @sorted_startshit1 = sort { $a <=> $b } @{$starts{$transc{$hit1}}};
                @sorted_startshit2 = sort { $a <=> $b } @{$starts{$transc{$hit2}}};
                @sorted_endshit1 = sort { $b <=> $a } @{$ends{$transc{$hit1}}};
                @sorted_endshit2 = sort { $b <=> $a } @{$ends{$transc{$hit2}}};
                $start_hit1 = $sorted_startshit1[0];
                $start_hit2 = $sorted_startshit2[0];
                $end_hit1 = $sorted_endshit1[0];
                $end_hit2 = $sorted_endshit2[0];
                $dist1 = $end_hit1 - $start_hit2;
                $dist2 = $start_hit1 - $end_hit2;
                $strand_hit1 = $strand{$transc{$hit1}};
                $strand_hit2 = $strand{$transc{$hit2}};
                if (($dist1 < 10000 and $dist1 > 0) or $dist2 < 10000 and $dist2 > 0) {
                    if ($strand_hit1 eq $strand_hit2) {
                        $hit1 =~ /TCONS_([0-9]*)/;
                        $code_hit1 = $1;
                        $hit2 =~ /TCONS_([0-9]*)/;
                        $code_hit2 = $1;
                        $substract = $code_hit1 - $code_hit2;
                        if ($substract == 1 or $substract == -1) {
                            $counter++;
                            print $fh $counter."\t".$hit1."\t".$hit2."\t".$key."\n";
                            print $counter."\t".$hit1."\t".$hit2."\t".$key."\n";
                        }
                    }
                }
            }
        }
    }
}
open$fh、“>”、“/results\u BLAST\u adjacentgenes\u samehit.txt”或die“无法写入文件。”;
打印“正在验证…\n”;
$counter=0;
对于$key(key%hash4000){
对于$hit1(@{$hash4000{$key}}){
对于$hit2(@{$hash4000{$key}}){
$text=$hit1.\t.$hit2.\t.$key.\n;
下一步如果$text~~@array;按@array,$text;
if($chromose{$transc{$hit1}}eq$chromose{$transc{$hit2}和$transc{$hit1}ne$transc{$hit2}){
@sorted_startshit1=sort{$a$b}@{$starts{$transc{$hit1}};
@sorted_startshit2=sort{$a$b}{$starts{$transc{$hit2}};
@sorted_endshit1=sort{$b$a}@{$ends{$transc{$hit1}};
@sorted_endshit2=sort{$b$a}@{$ends{$transc{$hit2}};
$start_hit1=$sorted_startshit1[0];
$start_hit2=$sorted_startshit2[0];
$end_hit1=$sorted_endshit1[0];
$end_hit2=$sorted_endshit2[0];
$dist1=$end\u hit1-$start\u hit2;
$dist2=$start\u hit1-$end\u hit2;
$strand_hit1=$strand{$transc{$hit1};
$strand_hit2=$strand{$transc{$hit2};
如果($dist1<10000和$dist1>0)或$dist2<10000和$dist2>0){
if($strand\U hit1 eq$strand\U hit2){
$hit1=~/TCONS_u0;([0-9]*)/;
$code_hit1=$1;
$hit2=~/TCONS(0-9]*)/;
$code_hit2=$1;
$substract=$code\u hit1-$code\u hit2;
如果($substract==1或$substract==1){
$counter++;
打印$fh$计数器。“\t”“$hit1”“\t”“$hit2”“\t”“$key”“\n”;
打印$counter.\t.$hit1.\t.$hit2.\t.$key.\n;
}
}
}
}
}
}
}
你可以看到,我有两条打印线。一行打印到屏幕,另一行打印到文件。但是,该文件仍然为空。为什么?我以正确的方式打开文件

你知道这里发生了什么吗


提前感谢。

如果您在文件运行时查看该文件,则输出可能会被操作系统缓冲。您可以通过立即关闭文件句柄来测试它是否刷新缓冲区。如果这样做有效,并且延迟对您来说是一个问题,请提供有关如何实现无缓冲写入的建议。

如果您在文件运行时查看该文件,则输出可能会被操作系统缓冲。您可以通过立即关闭文件句柄来测试它是否刷新缓冲区。如果这样做有效且延迟对您来说是个问题,请咨询有关如何实现无缓冲写入的建议。

您是在程序运行且句柄仍处于打开状态时查看文件,还是在其完成后查看文件?可用于将标准输出克隆到文件,而无需在脚本中处理该文件,例如
perl your_script.pl | tee results_BLAST_adjacentgenes_samehit.txt
您是在程序运行且句柄仍然打开时查看该文件,还是在它完成后查看该文件?可用于将标准输出克隆到文件,而无需在脚本中处理该文件,例如
perl your_script.pl | tee results_BLAST_adjacentgenes_samehit.txt