Perl:如果包中的子程序将某些内容打印到我的终端,如何在不更改包的情况下在程序中使用其输出?

时间:2011-09-15 12:10:19

标签: 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()仍会打印到我的终端而不是输出文件。有没有办法将其输出打印到我的outputfile而不改变包本身的子程序?

3 个答案:

答案 0 :(得分:5)

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

select (OUT);

答案 1 :(得分:1)

您可以重新打开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: $!";

答案 2 :(得分:1)

来自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
        ...
}

因此,printResults将文件句柄的可选参数输出到。如果未提供,则默认为STDOUT。您可以将其用作:

open(my $output, ">", $ARGV[1]);
$query_runner->execute($query);
$query_runner->printResults($output);