Perl Perl_4
Perl ディレクトリ操作 03 glob ダイヤモンド演算子 概要 (0x226)
目次 - Perl Index
Theme
Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x226 回。
Perl で ディレクトリからファイル名を取得する演算子「 glob 」の代わりにダイヤモンド演算子「 < > 」を利用する方法を確認する。今回は「 <> 」の概要を改めて確認する。
ダイヤモンド演算子
ダイヤモンド演算子 ( 別名: 山カッコ )「 < > 」は、「 Perl 「 ファイルハンドル 」: ダイヤモンド演算子と print, printf (0x4a) 」で確認したように、ファイルハンドルからファイルを読み込むことも可能です。
これから確認するのは、このダイヤモンド演算子を「 グロブ 」として利用する方法ですが、ここではダイヤモンド演算子の概要を改めて確認します。
「 < > 」の概要
perlop - perldoc.jp では、ダイヤモンド演算子は「 ヌルファイルハンドル 」と呼ばれています。
曰く、
ヌルファイルハンドル <> は特別で、sed や awk および、ファイル名の リストを取って、それら全てからの入力の各行に同じことをするような その他の Unix フィルタプログラムをエミュレートするために使われます。
とのことです。
「 <> 」からの入力は、通常標準入力「 STDIN 」かコマンドラインの起動引数が設定されています。
「 <> 」では、始めに配列「 @ARGV 」が調べられます。「 @ARGV 」は起動引数のリストが格納される特別な配列で、「 <> 」が「 @ARGV 」を調べることも含めて (0x3b) で確認しました。
「 @ARGV 」が空の場合は、「 $ARGV[0] 」に「 - 」( Hyphen ) がセットされます。「 - 」は、標準入力「 STDIN 」からの入力を受付けます。
処理の概要
こうした「 <> 」の動作を疑似的なコードで書くと次のようになるそうです。
# @ARGV が空なら配列の先頭に「 - 」を追加
unshift(@ARGV, '-') unless @ARGV;
# @ARGV から shift で値を取り出しつつループ
while ($ARGV = shift) {
# $ARGV の値をファイルハンドル ARGV として open
open(ARGV, $ARGV);
# ファイルハンドル ARGV を <> で読み込みながらループして処理
while(<ARGV>) {
# 各行の処理をするコード
...
}
}
実際に「 <> 」は内部的にファイルハンドル「 ARGV 」を利用しているので「 <> 」と「 <ARGV> 」は同義語だとのことです。
ただし、上記の疑似コードのように「 <ARGV> 」を利用してもうまく動作はしないそうです。
「 <> 」を含めて Perl で利用する I/O 関連の演算子は perlop "I/O 演算子 " - perdoc.jp を読み込むと良さそうです。
0x226 -> 0x227 へ
次回は、ダイヤモンド演算子 ( ヌルファイルハンドル )「 <> 」を実際にグロブとして利用する方法を確認します。
参考情報は書籍「 初めての 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)