Perl: если подпрограмма из пакета что-то печатает на моем терминале, как я могу использовать ее вывод в моей программе без изменения пакета? - PullRequest
2 голосов
/ 15 сентября 2011

Я использую пакет в 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 () по-прежнему печатает на моем терминале вместо выходного файла. Есть ли способ напечатать его вывод в мой выходной файл без изменения подпрограммы самого пакета?

Ответы [ 3 ]

5 голосов
/ 15 сентября 2011

Вы можете использовать select для установки дескриптора файла печати по умолчанию, например.

select (OUT);
1 голос
/ 30 января 2014

С 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);
1 голос
/ 15 сентября 2011

Вы можете снова открыть 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: $!";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...