Итак, я сделал функции для захвата каналов
sub capture_stdout (&) {
my $s;
open(local *STDOUT, '>', \$s);
shift->();
return $s;
}
sub capture_stderr (&) {
my $s;
open(local *STDERR, '>', \$s);
shift->();
return $s;
}
Они отлично работают.Теперь передо мной стоит задача: я хочу создать функцию, которая принимает каналы в качестве аргументов и перенаправляет их все в одну подпрограмму.Мне пока не удалось заставить его работать.До сих пор я готовил что-то, что компилируется:
sub capture(@&) {
my $c = pop;
my $o = [];
say {$_[$_]} $_[$_] for (0 .. $#_);
open(local *{$_[$_]}, '>', \$o->[$_]) for (0 .. $#_);
$c->();
return $o;
}
use Data::Dumper;
say Dumper( capture *STDOUT, *STDERR, sub{ say 1; warn 2; } );
, но это ничего не захватывает.Я не могу понять, как это исправить.Однако я убежден, что это local *{$_[$_]}
нуждается в исправлении, хотя я могу ошибаться.Полный вывод:
*main::STDOUT
*main::STDERR
1
2 at capture.pl line 15.
$VAR1 = [
undef,
undef
];
Итак, вопрос: можно ли вообще делать то, что я пытаюсь, и если да, то как?
Спасибо.