間に違いはありません
open my $PIPE, '| command';
対
open my $PIPE, '|-', 'command';
「安全な」オープンは実際には
open my $PIPE, '|-', 'program', @one_or_more_args;
このバージョンは、プログラムを直接起動することが保証されています。シェルは呼び出されません。また、引数をシェル リテラルに変換する必要がなくなります。言い換えると、
open my $FH, '|-', 'program', @one_or_more_args;
と類似しています
use String::ShellQuote qw( shell_quote );
open my $FH, '|'.shell_quote('program', @one_or_more_args);
ただし、シェルがなければ (リソースの無駄が少なくなり、シェルの代わりにプログラムの PID を取得し、プログラムがシグナルで停止したかどうかを知ることができます)。
残念ながら、 のような引数がゼロのプログラムの構文はありませんsystem
。
(これopen my $PIPE, "|-"
以上の引数はありませんが、それは別のものです。)