Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl
  1. Perl
  2. 演算子
  3. here

バッククォート演算子 - 別プロセスを実行し標準出力を取得

バッククォート演算子を使うと、別のプロセスを実行し、プロセスが生成した標準出力を取得することができます。

# バッククォート演算子
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";
Qiitaで
「3分間Perlテキストクッキング」
という連載を始めました。
テキスト処理を題材にして、3分くらいで読める分量で、書いていきます。
文字コード、テキストデータ、コンピュータにおけるテキストの扱いなど、ソフトウェアの基礎の話題も
3分間Perlテキストクッキング