バッククォート演算子 - 別プロセスを実行し標準出力を取得
バッククォート演算子を使うと、別のプロセスを実行し、プロセスが生成した標準出力を取得することができます。
# バッククォート演算子 my $output = `$cmd`;
system関数とかなりよく似ていますね。system関数が戻り値として、終了ステータスを返すのに対して、バッククォート演算子は、プロセスの標準出力を返します。
lsコマンドを実行する
バッククォート演算子のひとつの例としてカレントディレクトリの内容を表示するLinuxのlsコマンドを実行してみます。
my $output = `ls`;
$outputには、カレントディレクトリの一覧が表示されます。
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
呼び出したプロセスの戻り値をチェックするには
バッククォート演算子で呼び出すプロセスが失敗したりエラーステータスを返したりした場合は、どのようにチェックするのでしょうか。
特殊変数「$?」を使用します。
この値が0以外だった場合は、何らかのエラーが発生しています。
# エラーチェック if ($?) { die "Command error"; }
さらに詳しくエラーの状態を知ることもできます。
$?は16bitの値で、上位8bitに、子プロセスの終了ステータスが格納されます。右8bitシフトをすれば、終了ステータスが取り出せます。
my $output = `ls`; # 子プロセスの終了ステータスをチェック my $status = $? >> 8; if ($status != 0) { # エラー処理 }
バッククォート演算子のセキュリティ
バッククォート演算子は、セキュリティの問題が起こりやすい演算子です。たとえば、もしWebからの入力データが「rm」で、それをバッククォート演算子にチェックせずに渡したとしたらと考えてください。
バッククォート演算子によって、意図しないコマンドを実行されてしまいます。
ユーザーからの入力をプログラムで受け取っている場合は、バッククォート演算子に渡す文字列については、必ず入力が安全なものであることを確認してください。
バッククォート演算子のサンプル
バッククォート演算子のサンプルです。
use strict; use warnings; my $output = `ls -l`; if ($?) { die "Command error"; } print "$output\n";