Вы можете легко зафиксировать выходной и выходной значения команды, используя Capture :: Tiny .Кроме того, при использовании встроенной системы всегда проверяйте, успешно ли выполнено выполнение, если это не удалось, это указывается возвращаемым значением -1.
use strict;
use warnings;
use Capture::Tiny 'capture_stdout';
my $check = "perly.pl u=foo";
my ($stdout, $exit) = capture_stdout { system 'pgrep', '-fc', $check };
die "pgrep failed: $!" if $exit == -1;
Помнитечто ваш вывод, скорее всего, закончится новой строкой, даже просто счетчиком, так что вы, вероятно, захотите chomp it.
Вы также можете использовать оператор backticks / qx * 1013* чтобы вернуть только STDOUT, но это всегда будет передавать команду через оболочку, требуя от вас использовать String :: ShellQuote для аргумента, содержащего пользовательский ввод, как отмечено @ ikegami.
use strict;
use warnings;
use String::ShellQuote;
my $check = shell_quote "perly.pl u=foo";
my $stdout = `pgrep -fc $check`;
die "pgrep failed: $!" if $? == -1;
Альтернативой является IPC :: System :: Simple , которая предоставляет capturex
, форму оператора обратных ссылок, которая принимает список аргументов, подобных system, и никогда не пропускает их через оболочку.По умолчанию он генерирует исключение в случае сбоя команды или при наличии ненулевого кода выхода, но вы можете указать, чтобы разрешить определенные коды выхода.Поскольку pgrep возвращает ненулевой код выхода, если совпадений нет, вы хотите разрешить ненулевые коды выхода.
use strict;
use warnings;
use IPC::System::Simple qw(capturex EXIT_ANY $EXITVAL);
my $check = "perly.pl u=foo";
my $stdout = capturex EXIT_ANY, 'pgrep', '-fc', $check;
my $exit = $EXITVAL;