Perl Perl_0
Perl 「 each 演算子 」で配列のインデックスと要素を取り出す (Perl 5.12 以降) (0x2b)

Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x2b 回。
Perl で、配列変数の「 インデックス 」と「 要素 」を取り出す「 each 演算子 」について。ただし、Perl 5.12 以降でのみ有効。
each 演算子の書式
each 演算子の書式は次の通りです。
each HASH
each ARRAY
each EXPR
最初に書かれている「 each HASH 」は、「 ハッシュ (Hash) 」と呼ばれる、「 キー 」と「 値 」を持った変数に対して利用する書式です。これは Perl 5.12 未満でも利用出来ます。ハッシュ変数については別途説明する予定です。
「 each EXPR 」の「 EXPR 」は何らかの「 式 」を表します。「 Perl 5.14 からスカラの EXPR を取れる様になった (perldoc.jp) 」そうですが、僕はまだ詳細を理解していません。
each ARRAY の動作確認
ひとまず、Perl 5.12 以降に限られる利用方法ですが、配列に対して each 演算子を使った動作を確認します。ちなみに僕は each を「 イーチ 」と読んでいます。
use 5.012 # Perl 5.12 を使用する
my @side7 = qw/ amuro fraw kai hayato /;
while ( my( $index, $value ) = each @side7 ) {
say "$index: $value";
}
4 行目にある while 文の条件式では、リストコンテキストでスカラ変数 $index と $value を宣言しています。
これは、each 演算子で処理された、配列 @side7 の「 インデクス 」と「 要素の値 」をそれぞれ受け取るためのものです。

「 my 」という演算子は、プライベートなレキシカル変数を生成するためのものです。使い方や、レキシカルの意味については別で説明する予定です。ひとまずここでは無視しましょう。
5 行目の say 文の実行結果はおそらく次の様になります。
0 : amuro
1 : fraw
2 : kai
3 : hayato
each ARRAY の動作を foreach で代用する
Perl 5.12 未満のバージョンで、同じ動作を実現する場合は foreach 文を利用します。
my @side7 = qw/ amuro fraw kai hayato /;
foreach $index ( 0..$#side7 ) {
print "$index : $side7[$index]\n";
}
foreach 文の制御変数にスカラ変数 $index を指定していますが、これを省略した場合は、暗黙的に「 $_ 」が利用されることを「 Perl デフォルト (定義済み) の変数 $_ について (0x28) 」で確認しています。
foreach 文の条件式「 ( 0 .. $#side7 ) 」は、範囲演算子「 .. 」を使って、配列のインデクスの 0 から末尾の数 ($#side7) の数値のリストを構成しています。
foreach は、この数値リストを 0 から順に $index に格納します。
4 行目の print 文では、「 $side7[$index] 」を利用して、つまり、$index の値を利用して、配列の各要素にアクセスしています。
print 文の実行結果は次の様になります。each 演算子と say を使った前出のコード同じ結果です。
0 : amuro
1 : fraw
2 : kai
3 : hayato
0x2b -> 0x2c へ
「 each 」は英語で、「 各自 」や「 それぞれ 」といった意味を持っているそうです。
これに従って、Perl の each 演算子は、配列変数の「 インデクス 」と「 要素 」をそれぞれ別個に取り出してくれます (Perl 5.12 以降)。
また、後日説明する予定の「 ハッシュ変数 」の場合は「 キー 」と「 値 」を持っています。each 演算子はこれもそれぞれ別個に取り出すことが可能です。
「 foreach 」文は「 for 」と「 each 」の単語からなっています。これらの関係もやがて明かされることになるでしょう。
参考情報は以下の書籍を中心に Wikipedia および各 Web サイト。それと詳しい先輩。
参考 :「Randal L. Schwartz, brian d foy, Tom Phoenix 共著 近藤 嘉雪 訳「初めての Perl 第 6 版」(オライリー・ジャパン発行 ISBN978-4-87311-567-2)」
次回 (0x2c) へ続く。
過去記事 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)