В Perl один способ чтения STDOUT подпроцесса является использование open
:Как читать STDOUT из подпроцесса в OO Perl
open(PIPE, "ls -l |");
Я искал более объектно-ориентированный подход к сделайте это, хотя, и я использовал IO::Pipe
с некоторым успехом. Однако я хочу обнаружить ошибки, особенно если команда не является исполняемой. Однако я не могу понять, как это сделать через IO::Pipe
. Вот что у меня есть:
use strict;
use warnings;
use IO::Pipe;
my($cmd) = join (" ", @ARGV);
open(PIPE, "$cmd |") || die qq(error opening PIPE);
while (<PIPE>) {
chomp;
print "DBG1: $_\n";
}
close PIPE;
my($pipe) = IO::Pipe->new();
$pipe->reader($cmd);
die qq(error opening IO::Pipe) if $pipe->eof();
while (<$pipe>) {
chomp;
print "DBG2: $_\n";
}
$pipe->close();
Если команда подпроцесса является недействительной, обе проверки будет правильно die
. Если подпроцесс не производит никакого вывода, хотя, eof()
сообщит об ошибке, даже если сама команда отлично:
$ perl pipe.pl "ls -l >/dev/null"
error opening IO::Pipe at pipe.pl line 20.
куча вопросов, то:
Есть разумный OO способ читать из подпроцесса в Perl? Является IO::Pipe
правильным инструментом для использования? Если да, как я могу проверить, чтобы команда подпроцесса была успешно создана? Если нет, что я должен использовать? Я не хочу писать в подпроцесс, поэтому я не думаю, что хочу IPC::Open2
или IPC::Open3
. Я бы предпочел использовать основной модуль, если это возможно.
По умолчанию Обратные кавычки переопределяет поведение '' \ \ '' используя [источник фильтрации] (https://metacpan.org/pod/Backticks#Source-filtering). Я отключил бы это, поскольку [исходные фильтры, как правило, плохие] (http://stackoverflow.com/questions/1785852/why-are-perl-source-filters-bad-and-when-is-it-ok-to- используй их). Документы рекомендуют использовать Backticks; нет Backticks; ', хотя я все еще пытаюсь обвести голову вокруг того, как это работает. – ThisSuitIsBlackNot
@ThisSuitIsBlackNot - Да, я заметил, что в POD и различные способы восстановления функции backlick perl, но оставил ее для того, чтобы пользователь мог прочитать сам POD. Я предположил, что если он захочет использовать более OO-подход для вызова внешних команд, он будет делать это для всех –
. Я хочу сказать, что ваш примерный код изменяет поведение основного оператора без указания того, что он это делает. Я думаю, что гарантии упоминаются в тексте вашего ответа (или самого кода) вместо того, чтобы быть похороненным в ссылке. – ThisSuitIsBlackNot