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

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

Другой вопрос показывает, что мне нужно, но на Ruby. К сожалению, я не могу использовать Ruby для этого проекта и не хочу избегать обратных кавычек.


person Jonas Wagner    schedule 09.09.2010    source источник
comment
Можете ли вы уточнить, что я не хочу избегать обратных кавычек?   -  person Ether    schedule 09.09.2010
comment
Смутно связанный с этим - я часто пишу вещи, используя систему или бэктикс, а затем понимаю, что хочу проверить, какую команду я вывожу. Я думал о создании диагностической версии системы.   -  person justintime    schedule 09.09.2010
comment
@justintime: я думаю, что исправление IPC::System::Simple с использованием флага $DEBUG было бы очень кстати.   -  person Ether    schedule 09.09.2010
comment
Вы говорите Ха-Ха-Ха, вы глупый встроенный. Бесит это до бесконечности.   -  person Chas. Owens    schedule 09.09.2010
comment
и я не хочу избегать обратных кавычек. Почему людей так заботит синтаксис, который они используют? Почему так важно использовать обратные апострофы, а не писать еще пару строк в подпрограмме, чтобы делать то, что вам нужно, или даже использовать такой модуль, как Git::Wrapper?   -  person brian d foy    schedule 09.09.2010
comment
@Ether, @brian d foy: я написал это, чтобы прояснить свои требования. На этот вопрос было бы довольно легко ответить, если бы вместо обратных кавычек использовалась система или какой-либо другой метод, потому что можно легко заменить встроенный метод (perldoc.perl.org/perlsub.html#Overriding-Built-in-Functions) Меня волнует синтаксис? Не совсем... хотя программирование — это всегда поиск самого красивого решения.   -  person Jonas Wagner    schedule 10.09.2010
comment
Почему бы просто не использовать обратные кавычки? Или завернуть обратные кавычки?   -  person brian d foy    schedule 10.09.2010
comment
Почему бы просто не использовать обратные кавычки?... что вы имеете в виду?   -  person Jonas Wagner    schedule 13.09.2010


Ответы (2)


Вы можете* имитировать встроенную функцию readpipe. Perl вызовет вашу фиктивную функцию, когда встретит обратные кавычки или выражение qx.

BEGIN {
  *CORE::GLOBAL::readpipe = \&mock_readpipe
};

sub mock_readpipe {
  wantarray ? ("foo\n") : "foo\n";
}

print readpipe("ls -R");
print `ls -R`;
print qx(ls -R);


$ perl mock-readpipe.pl
foo
foo
foo

* — если у вас есть perl версии 5.8.9 или новее.

person mob    schedule 09.09.2010
comment
Кажется, это правильно работает только в более поздних версиях perls. 5.8.8 печатает foo только для readpipe(...), а не для обратных кавычек или qx. Работает, как показано в 5.10.1. - person Eric Strom; 09.09.2010
comment
Хороший улов, Эрик. Это было изменено в версии 5.8.9: search.cpan .org/~jesse/perl-5.12.2/pod/ - person mob; 09.09.2010

Вместо обратных кавычек вы можете использовать capture из IPC::System::Simple, а затем напишите фиктивную версию Capture() в своем модульном тесте.

# application
use IPC::System::Simple qw(capture);
my $stuff = capture("some command");

# test script
{
     package IPC::System::Simple;
     sub capture
     {
         # do something else; perhaps a call to ok()
     }
}

# ... rest of unit test here
person Ether    schedule 09.09.2010
comment
Если вы собираетесь вызывать подпрограмму, просто напишите свою собственную оболочку, чтобы вам вообще не приходилось издеваться над ней. - person brian d foy; 10.09.2010