foreach 内でのインデックスの取得
Perl で配列を処理する場合、インデックスを意識しなくて良いのであれば以下の様に書けます。
my @week = qw/sun mon tue wed thu fri sat/; foreach (@week) { s/^(.)/uc($1)/e; # 頭文字を大文字に変換する } ## この時点で @week の中身は ## Sun, Mon, Tue, Wed, Thu, Fri, Sat ## となっている。
一方、インデックスを意識する必要がある場合、大抵は以下の様にしています。(私の場合)
my @week = qw/Sun Mon Tue Wed Thu Fri Sat/; # foreach を利用するパターン foreach (0..$#week) { printf '[%d] %s' . "\n", $_, $week[$_]; # インデックスと共にリストの内容を表示する } # for を利用するパターン for (my $loop = 0; $loop < @week; $loop++) { printf '[%d] %s' . "\n", $loop, $week[$loop]; # インデックスと共にリストの内容を表示する } ## 上記 2 例の出力結果は共に ## [0] Sun ## [1] Mon ## [2] Tue ## [3] Wed ## [4] Thu ## [5] Fri ## [6] Sat ## となる。
……どちらもあまり綺麗なコードとは言えないですね。
なので、これを意識しない場合と同じ様に書けないか、というのが今回のテーマです。
つまり、「 "foreach (@week) { ... }
" と書いた上で、 foreach ブロック内でカレント要素のインデックスを取得する」と云う事なのですが、調べても出てこない。
「 Perl プログラミング救命病棟」の 6.2.16 では、上の「インデックスを意識する必要がある場合」の様な記述を「カーゴカルト」として扱っているのですが。。。
正直、今まで Perl に関する知識って、「はじめての Perl 」と「 Perl プログラミング救命病棟」を読んだ程度(ラクダ本は持っているけど一部しか読めていない)なので、こういったテクニックに疎いんですよねぇ。
「 Perl ベストプラクティス 」とかを読めば判るようになるのかしら。
ところで、「 Perl プログラミング救命病棟」の 6.2.16 の後半部に、「 foreach は、 $_ をデフォルトのループ変数として使用するだけでなく、添え字形式で使用することもできます
」という記述があるのですが、この「添え字形式で使用する」ってどういう意味なんでしょうか。
個人的には、これがまさに私のやりたい事であり、「出来る」と云う事なのかなと思うのですが、実例が紹介されていないのでよく判らない。。。