The multi-arg usage of system() is good -- somebody needed to point that out (and I'll explain it for the OP).
But the "or die" part is wrong: system() will return the exit status of the process, which is based on shell semantics: a return value of zero means "success" (i.e. "good") whereas any non-zero value means "failure" (i.e. "bad") -- so you probably want to say "and die" instead. But that's confusing, so it's usually better to say it like this:
my $err_stat = system( $prog, @args );
die "system failed on $prog @args: $?" if $err_stat;
(update: my apologies -- I missed the "== 0" part in borisz's post.)
As to the reason for the multi-arg usage, the difference between this:
system( "$prog @args" );
and this:
system( $prog, @args );
can be demonstrated harmlessly if $prog is set to something like "cat" and any element of @args is set to something like "\$HOME/.bashrc; echo I could delete everything right now".
In the multi-arg usage (the latter choice), each element of @args is passed directly to the "argv" array of "cat" -- if an arg does not map to a readable file name, cat reports an error. In the single-string command-line case, the whole string is passed to a shell, and the shell executes the string. If the string happens to contain workable instructions that you don't expect or don't want, you could be in for a nasty surprise. |