まくまくPerlノート
子プロセス(外部プログラム)の出力を取り込む(バッククォート文字列)
2008-04-18

バッククォートを使用して外部プログラムを起動すると、外部プログラムの出力を文字列として取得することができます。

my $result = `echo Hello`;  #=> "Hello\n"

バッククォート文字列の中では、ダブルクォート文字列と同様に変数展開が行われます。

my $name = 'Ben';
my $result = `echo Hello, $name`;  #=> "Hello, Ben\n"

バッククォート文字列をリストコンテキストで評価すると、出力を行ごとに分割して取得することができます。 次の例では、Windows のファイル拡張子の関連付けを取得する assoc コマンドを実行し、その出力を配列として取得しています。

my @associations = `assoc`;

次のようにして、foreach (for) ループで一行ずつ処理することもできます。

for (`assoc`) {
    my($ext, $prog) = /(\S+)=(.*)/;
    print "$ext --> $prog\n";
}

標準エラーへの出力も一緒に取得したい場合は、次のように、2>&1 というリダイレクトを使って標準エラーを標準出力にマージしてしまう方法があります。

my $result = `command 2>&1`;
2008-04-18