Вам не нужно идти до open3
, который IIRC предназначен только для чтения и записи во внешнюю команду, и даже тогда есть другие методы.
Для вашей проблемы я предлагаю использовать Capture::Tiny
, который может захватывать (или даже передавать) STDOUT и STDERR из всего, что проходит внутри его блока. Например, на ваш вопрос:
#!/usr/bin/env perl
use strict;
use warnings;
use Capture::Tiny qw/capture/;
...
my ($stdout, $stderr) = capture {
system ( "snmpwalk -v $version -c $community $hostname $oid" );
};
В качестве другого примера рассмотрим этот функциональный код:
#!/usr/bin/env perl
use strict;
use warnings;
use Capture::Tiny qw/capture/;
my ($stdout, $stderr) = capture {
system ( "echo 'hello'" );
system ( "date" );
warn "Arg1!";
};
print "STDOUT:\n$stdout";
print "STDERR:\n$stderr";
который только что дал мне:
STDOUT:
hello
Mon Dec 19 23:59:06 CST 2011
STDERR:
Arg1! at ./test.pl line 11.