Czy chcesz przechwycić dane wyjściowe w zmiennej? Jeśli tak, użyj wstecznego kliknięcia lub qx{}
z odpowiednim przekierowaniem. Na przykład, można użyć:
#/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";
}
(zdarza mi się mieć programy pth1, PTH2 i pth3 w katalogu - zostały one wykonane OK; pth4 i powyżej błędów zapisu do stderr; przekierowanie było konieczne.)
Powinieneś zawsze sprawdzić sukces operacji, takich jak open()
.
Dlaczego jest to konieczne? Ponieważ pisanie do zmiennej wymaga współpracy procesu pisania - i make
nie wie, jak współpracować.
$ out. = Qx {make}; działa, ale nie sądzę, że to dobry sposób. – Deck
@Israfil: jest to * sposób na zrobienie tego. –