Perl:如果包中的子例程向我的终端输出一些东西,我如何在不改变包的情况下在我的程序中使用它的输出?



我使用Perl中的一个包(Biomart)来打印查询的结果。输出的语法如下所示:

$query_runner->execute($query);
$query_runner->printResults();

将查询结果打印到终端。相反,我希望将打印的内容打印到输出文件中。我试着:

$output = "@ARGV[1]";
open OUT , ">$output" or die "Can't open $output: @ARGV[1].txt!n";
$query_runner->execute($query);
print OUT $query_runner->printResults();

但这似乎不起作用,子例程printResults()仍然打印到我的终端,而不是输出文件。有没有一种方法可以在不改变包本身的子例程的情况下将其输出打印到我的输出文件?

您可以使用select设置默认打印文件句柄,例如

select (OUT);

您可以重新打开STDOUT以写入给定的文件,调用打印子程序,然后恢复旧的STDOUT:

open my $oldout, ">&STDOUT" or die "Can't dup STDOUT: $!";
open STDOUT, '>', $ARGV[1] or die "Can't open $ARGV[1]";
$query_runner->printResults();
open STDOUT, ">&", $oldout or die "Can't dup $oldout: $!";

From https://github.com/pubmed2ensembl/biomart-plus-extras/blob/master/lib/BioMart/QueryRunner.pm:

sub printResults {        
        my ($self, $filehandle, $lines) = @_;
        $filehandle ||= *STDOUT; # in case no fhandle is provided
        ...
}
因此,prinresults接受要输出到的文件句柄的可选参数。如果没有提供,则默认为STDOUT。你可以这样使用:
open(my $output, ">", $ARGV[1]);
$query_runner->execute($query);
$query_runner->printResults($output);

相关内容

最新更新