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