Perl Perl_5
Perl コマンドの出力を取得するバッククォート演算子 ``, qx (0x25a)

目次 - Perl Index
Theme
Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x25a 回。
Perl のバッククォート演算子「 `` 」とその代替のクォート演算子「 qx 」を利用して、システムコマンドの実行結果を取得する。
バッククォート演算子「 `` 」
(0x257) では関数「 exec 」を、(0x258) では関数「 system 」の動作を確認しましたが、これらの関数ではシステムコマンドの実行結果を Perl プログラム内で受け取ることは出来ませんでした。
今回確認するバッククォート (逆クォート) 演算子「 `` 」は、Perl プログラム内から実行したシステムコマンドの実行結果を Perl プログラム内で取得することが出来ます。
バッククォート演算子「 `` 」は、システムコマンドが STDOUT ( 標準出力 ) に出力する内容を戻り値として Perl プログラムに返します ( STDERR ( 標準エラー出力 ) は Perl と同じ出力先を利用します )。
バッククォート演算子「 `` 」は、必ず「 /bin/sh 」( またはその代替品 」を呼び出してコマンドを実行します。
ですから、もし外部からの入力値をコマンドの一部として実行する場合は汚染検査 ( taint check ) が必須だと理解しています。
Perl の汚染検査については perlsec - perldoc.jp 等を確認します。
「 `` 」を利用する
バッククォート演算子「 `` 」は次のようにして利用します。
# execute echo in back-quote
chomp(my $echo = `echo Hello`);
# Hello
print "$echo (in Perl)\n";
コマンド実行時の出力は、多くの場合行の末尾に改行文字を持っているので、改行文字を取り除く演算子「 chomp 」(0x2e) を利用します。
上記を実行すると次の出力が得れらます。
Hello (in Perl)
出力された文字列から 5 行目の print 文が出力していることが分かります。
「 `` 」の変数展開
バッククォート演算子「 `` 」は、ダブルクォートと同様に変数展開を行います。
my $command = 'echo';
my $arg = 'Hello';
# $command も $arg も展開される
chomp(my $echo = `$command '$arg'`);
# Hello (in Perl)
print "$echo (in Perl)\n";
シェルのために $ 変数 ( dollar variable ) の変数展開を Perl の中で行いたくない場合は、バッククォートの代替となるクォート演算子「 qx 」を利用します。
クォート演算子「 qx 」
クォート演算子「 qx 」は、(0x1e) で確認した「 qw 」の仲間で、バッククォートの代わりを務めることが可能です。
クォート演算子の仲間は、引数を囲むためのデリミタの記号をいくつか選ぶことが出来ますが、「 qx 」のデリミタとしてシングルクォートを指定すれば Perl による変数展開を抑制出来ます。
# delimiter of single-quote
chomp(my $echo = qx'echo process ID: $$');
print "$echo (in Perl)\n";
変数「 $$ 」は、実行プロセスのプロセス ID を持っています。これを実行すると、シェルが「 $$ 」を展開するので、次のような結果を得られます。
process ID: 4535 (in Perl)
シェルのドル変数については Linuxのシェルスクリプト変数の記号あれこれ - 気まぐれな備忘録(仮) や シェルスクリプト変数 - Capm Network 等でまとめられています。
無効コンテキストでの利用
バッククォート演算子「 `` 」 は、無効コンテキスト ( void context ) では利用しないようにします。
perlfaq8 - perldoc.jp によれば、厳密には悪いことではないそうですが、コマンドの出力を取得しない場合のために関数「 system 」(0x258) が用意されていると言うことです。
ちなみに、「 バッククォート演算子を無効コンテキストで利用する 」とは次のようなものです。
# 戻り値をどこにも格納しない
`something_command`;
この場合コマンドの出力はバッククォート演算子が取得してしまうので標準出力には何も出力されません。
0x25a -> 0x25b へ
次回は、バッククォート演算子をリストコンテキストで利用する等の応用を確認します。
参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。
目次 - Perl Index
Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)