Если вы передаете только один скаляр, capture
ожидает, что это будет команда оболочки.
Таким образом, capture('perl xyz.pl Hello')
работает.
Если вы передаете несколько скаляров, capture
ожидает, что первым будет путь к программе для выполнения.Остальные передаются как аргументы.
Таким образом, capture('perl xyz.pl', 'Hello')
не работает.
Вы можете использовать
use IPC::System::Simple qw( capture );
my @cmd = ( 'perl', 'xyz.pl', 'Hello' );
capture(@cmd)
Но вы никогда не захотитеиспользуйте capture
, если вы не передадите один скаляр, который является командой оболочки.Используйте capturex
при передаче пути и аргументов.
use IPC::System::Simple qw( capturex );
my @cmd = ( 'perl', 'xyz.pl', 'Hello' );
capturex(@cmd)
Но предположим, что вы получили строку perl xyz.pl
из другого места.Необходимо вызвать оболочку, поэтому нам нужно преобразовать аргументы в литералы оболочки.
use IPC::System::Simple qw( capture );
use String::ShellQuote qw( shell_quote );
my $cmd = 'perl xyz.pl';
my @extra_args = 'Hello';
my $full_cmd = $cmd . ' ' . shell_quote(@extra_args);
capture($cmd)
В качестве альтернативы,
use IPC::System::Simple qw( capturex );
my $cmd = 'perl xyz.pl';
my @extra_args = 'Hello';
capturex('sh', '-c', 'eval $0 "$@"', $cmd, @extra_args)