Как расширить переменные в обработчиках чтения Perl?

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

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

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

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

Run:ls /root
Run:ls $dir

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

Обновление:

Я решил использовать действительно уродливый обходной путь для моей проблемы. Оказывается, использование 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

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


person Sandip Bhattacharya    schedule 14.06.2012    source источник


Ответы (2)


Похоже, это ошибка в Perl. Используйте perlbug, чтобы сообщить об этом.

person ikegami    schedule 14.06.2012

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

use IPC::Run 'run';

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

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

system( "ls", $dir ) == 0 or die "Cannot system - $!";
person LeoNerd    schedule 14.06.2012
comment
Спасибо за ссылку на модуль. Однако я ищу простой способ имитировать системные вызовы, такие как обратные кавычки и system(), для запуска моих модульных тестов устаревшего кода. - person Sandip Bhattacharya; 14.06.2012
comment
@SandipBhattacharya Я уверен, что не понимаю проблему. обратные кавычки и exec не возвращают никаких результатов, в то время как система делает это. подойдет ли eval и qx? - person shinronin; 14.06.2012
comment
@shinronin Я пытаюсь переопределить / смоделировать обратные кавычки в существующем устаревшем коде, чтобы я мог безопасно их протестировать. Хотя я могу заменить *CORE::GLOBAL::readpipe на имитацию обратных кавычек, они не работают в тех случаях, когда аргумент включает переменные, которые нужно расширить. Из-за этого непоследовательного поведения между обратными апострофами и readpipe() такой код трудно имитировать. Я не пытаюсь писать новый код. Если бы я это сделал, я бы использовал readpipe() вместо обратных кавычек, чтобы при желании можно было смоделировать код. - person Sandip Bhattacharya; 14.06.2012
comment
@shinronin: ты частично ошибаешься; обратные кавычки do обеспечивают вывод, в то время как system() молчит, а exec не может возвращать вывод (поскольку вызывающий его процесс заменяется). - person ; 15.06.2012
comment
@jeffbragg ой, правда. Я никогда не могу держать их прямо. perldoc -f — постоянный компаньон. ;-) - person shinronin; 15.06.2012