Perl Perl_0
Perl デフォルト (定義済み) の変数 $_ について (0x28)

Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x28 回。
Perl で、予め定義されている特殊な変数「 $_ 」について。
デフォルトの変数 $_
Perl には、デフォルト (定義済み) の変数として「 $_ 」が用意されています。
「 デフォルトの変数 」とは、変数 (ここではスカラ変数) が指定されるべき場所で、変数を省略した場合に代替で利用される変数です。
例えば foreach 文の場合は次の様に、制御変数「 VAR 」を省略出来ます。
@side7 = qw/ amuro fraw kai hayato /;
foreach (@side7) { # VAR を省略
print "$_\n"; # 代わりに $_ を指定する
}
変数 $_ の様々な例
変数「 $_ 」の利用は、foreach 文に限りません。
perldoc.jp (perlvar - Perl で定義済みの変数) では次の例はそれぞれ同値と紹介されています。
まず、while 文の条件式 (EXPR) です。
while (<>) { ... }
while (defined($_ = <>)) { ... }
行入力のためのダイヤモンド演算子 (<> : これについては後述) を while 文の条件式に指定しています。この条件が「 真 」であるならば、ブロック内の処理を行う算段です。
ダイヤモンド演算子の値を受け取る変数は何も指定されていません。ということは、デフォルトの変数「 $_ 」が暗黙的にその役割を引き受けます。
この際、「 $_ 」が undef でないかを確認するために defined 関数 (Perl defined 関数で undef を検知する (0x1a)) を持ち出して、条件が「 真 」である場合に処理を行わせる様明示的に指定することが出来ますが、省略したとしてもそれは同値だということです。
ただし、これが同値なのは、while 文の中でのみだそうです。
次の例は、「 /PATTERN/ 」と「 ^ (キャレット) 」を使った正規表現のパターンマッチングです。ここでは詳細の説明を省きますが、行の行頭に現れる文字列「 Subject: 」をマッチングしようとしています。
/^Subject:/;
$_ =~ /^Subject:/;
「 =~ 」については「 Perl で正規表現を少しだけ説明 (0x18) 」で少しだけ説明しています。
ここでは、マッチングの対象になる変数が省かれている場合、対象の変数は暗黙的に「 $_ 」になっているということと、分かりきったそれは省くことが可能であることを表しています。
僕にとって、「 =~ 」まで省略出来るのは驚きでしたが、「「 /PATTERN/ 」とくれば、そこに「 =~ 」演算子があるのは自明のこと。「 $_ 」を省くならば、これも一緒に省いてしまえ。」という声が聞こえます。
なるほど、確かにそうかもしれません。
次の例も同様です。ここでは、「 tr 」という文字列置換のための演算子を使って、アルファベットの小文字を大文字に置き換えようとしています。
tr/a-z/A-Z/;
$_ =~ tr/a-z/A-Z/;
改行文字を取り除くことでお馴染みの chomp 演算子 (Perl STDIN でキーボードから入力を受け付ける それと chomp 演算子 (0x16) ) も取り上げられています。
chomp;
chomp ($_);
初心者の身近な例では print 文でも「 $_ 」を利用可能です。
$_ = "To omit steps";
print; # To omit steps と表示
2 行目の print 文では、「 $_ 」の値を表示することになります。
0x28 -> 0x29 へ
「 Perl About (0x01) 」の所感で書いた様に、省略出来る範囲が大きい Perl は、 Perl に不慣れな人を混乱に陥れます。
例えば、「 $_ 」の存在を知らない状態で「 $_ 」を省略された場合、「 $_ 」の存在をを示す手がかりは、そのソースコードの中に存在しないだろうからです。
きっと、どこを探しても、Perl で書かれたソースコードに「 $_ 」の説明と等価な文は見つからないと思います。なぜなら、それは Perl ( とそのプログラマ ) にとって「 暗黙 」の了解事項であるからです。
しかしながら、この混乱を解消する手立てはとても簡単です。Perl の理解を前進させることです。
初めは奇妙とも思える数々の省略記法も、その存在が「 ある 」ことを理解してしまえば、その存在が「 ない 」ことが少しも気にならなくなります。これが、納得するということですね。
そして、おそらくこれは、 Perl に限った話ではないと思っています。
参考情報は以下の書籍を中心に Wikipedia および各 Web サイト。それと詳しい先輩。
参考 :「Randal L. Schwartz, brian d foy, Tom Phoenix 共著 近藤 嘉雪 訳「初めての Perl 第 6 版」(オライリー・ジャパン発行 ISBN978-4-87311-567-2)」
次回 (0x29) へ続く。
過去記事 RSS
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)