system関数 - 別プロセスを実行する
system関数を使うと、別のプロセスを実行することができます。
system $cmd;
プロセスが正常に終了した場合は0が戻り値として返されます。エラーチェックは次のように行うことができます。
tarやgzipなどのコマンドを実行したい場合はsystem関数を使うとよいです。
lsコマンドを実行する
system関数のひとつの例としてカレントディレクトリの内容を表示するLinuxのlsコマンドを実行してみます。
エラーチェックとしてor演算子とdie関数を使用しています。
my $cmd = 'ls'; system($cmd) == 0 or die "Can't execute $cmd: $!";
以下のように、カレントディレクトリの一覧が表示されます。
a.pl gperl module-starter.txt not_important_project ringowiki static-perl.tar batch Image-PNG-Simple mojo Object-Simple role taskdeal crontab.txt imager-japanese-translation.wiki mojo-examples
system関数に引数を渡す
system関数に渡すコマンドに引数を渡すには、コマンドを配列にしてsystem関数に渡します。たとえば「-l」と「tmp」という引数を渡したい場合は次のように記述します。
my @cmd = ('ls', '-a', 'tmp'); system(@cmd) == 0 or die "Can't execute @cmd: $!";
system関数のセキュリティ
system関数は、セキュリティの問題が起こりやすい関数です。たとえば、もしWebからの入力データが「rm」で、それをsystem関数にチェックせずに渡したとしたらと考えてください。
system関数によって、意図しないコマンドを実行されてしまいます。
ユーザーからの入力をプログラムで受け取っている場合は、system関数に渡す引数については、必ず入力が安全なものであることを確認してください。