14 июн. 2012 г., 12:26 от Sandip Bhattacharya

Как развернуть переменные в обработчиках Perl readpipe?

Кажется, что переменные в обратных галочках не раскрываются при передаче в функцию readpipe. Если я переопределю функцию readpipe, как мне расширить переменные?

BEGIN {
*CORE::GLOBAL::readpipe = sub {print "Run:@_\n"};
}

`ls /root`;
my $dir = "/var";
`ls $dir`;

Запуск этого дает:

Run:ls /root
Run:ls $dir

Я пытаюсь смоделировать внешние вызовы для тестового кода, который я пишу. Если где-то есть модуль CPAN, который может помочь позаботиться обо всем этом, это тоже поможет.

Update:

Я решил использовать действительно уродливый способ решения своей проблемы. Оказывается, используяreadpipe() вместо галочек расширяет переменные правильно. Я использую автоматический очиститель скриптов перед запуском моих тестов, который преобразует все обратные ссылки вreadpipe() перед запуском тестов.

например, работает:

$ cat t.pl

BEGIN {
    *CORE::GLOBAL::readpipe = sub {print "Run:@_\n"};
}

`ls /root`;
my $dir = "/var";
`ls $dir`;
readpipe("ls $dir");

дает:

$ perl t.pl
Run:ls /root
Run:ls $dir
Run:ls /var

Я все еще ищу более чистое решение все же.

Ответы на вопрос (0)

14 июн. 2012 г., 11:27 от LeoNerd

Вы, вероятно, хотите использоватьIPC::Run вместо.

use IPC::Run 'run';

run [ "ls", $dir ], ">", \my $stdout or die "Cannot run - $!";

Или, если вы не хотите захватывать вывод,system() может быть лучше

system( "ls", $dir ) == 0 or die "Cannot system - $!";
14 июн. 2012 г., 08:54 от ikegami

perlbug сообщить об этом.

ВАШ ОТВЕТ НА ВОПРОС