読者です 読者をやめる 読者になる 読者になる

雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

foreach 内でのインデックスの取得

Perl

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 は、 $_ をデフォルトのループ変数として使用するだけでなく、添え字形式で使用することもできます」という記述があるのですが、この「添え字形式で使用する」ってどういう意味なんでしょうか。
個人的には、これがまさに私のやりたい事であり、「出来る」と云う事なのかなと思うのですが、実例が紹介されていないのでよく判らない。。。