Вы хотите записать вывод в переменную? Если это так, вы должны использовать backticks или qx{}
с соответствующим перенаправлением. Например, вы можете использовать:
#/usr/bin/env perl
use strict;
use warnings;
# Ensure we have a way to write messages
open my $fh, '>', "output" or die;
close(STDOUT);
close(STDERR);
my $out;
open(STDOUT, ">>", \$out) or do { print $fh, "failed to open STDOUT ($!)\n"; die };
open(STDERR, ">>", \$out) or do { print $fh, "failed to open STDERR ($!)\n"; die };
foreach my $i (1..10)
{
print "print $i\n";
warn "warn $i\n";
my $extra = qx{make pth$i 2>&1};
print $fh "<<$i>><<$out>><<$extra>>\n";
}
(у меня в каталоге есть программы pth1, pth2 и pth3 - они были сделаны нормально; pth4 и выше записывают ошибки в stderr; перенаправление было необходимо.)
Вы всегда должны проверять успешность таких операций, как open()
.
Почему это необходимо? Поскольку запись в переменную требует взаимодействия процесса, выполняющего запись, а make
не знает, как сотрудничать.