system
, exec
, open '|-'
, open2
и т. Д. Позволяют указать команду для запуска в виде списка аргументов, которые будут переданы непосредственно в execvp
вместо запуска через оболочку.
Даже если perl
достаточно умен, чтобы запускать его напрямую, если он выглядит как «простая» команда, это избавляет меня от необходимости правильно экранировать аргументы со всеми неприятными ловушками, которые это влечет за собой.
Пример:
open my $out, '|-', $prog, @args;
system $prog, @args;
exec $prog, @args;
вместо
open my $out, "|$prog @args";
system "$prog @args";
exec "$prog @args";
Есть ли такой эквивалент для оператора qx//
?Или вы всегда должны делать это вручную, например.
sub slurpcmd {
open my $h, '-|', @_ or die "open $_[0]|: $!";
local $/ unless wantarray;
<$h>
}