高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

foreach廃止?

 第六回Perl授業です。今回はリファレンスの復習。今回は特に進んでないのでプレゼンテーションはなしです。
リファレンスはまあ、何とかなりそうな気がするのですが、前回あまり理解が出来てなかったのか、foreach構文でアウトだった模様です。
いちおう例を提示してみると

@list = ("one", "two", "three");
foreach my $item(@list)
{
  print "$item, ";
}
# one, two, three

となります。@listの各要素が$itemに格納されてループしているわけですね、
$item = "one"でブロック内実行、$item = "two"で実行、$item = "three"で実行 の三回。
これは

@list = ("one", "two", "three");
for(my $i = 0; $i < scalar @list; $i = $i + 1)
{
  print "$list[$i], ";
}
# one, two, three

と等価です。
foreachは$iのようなカウンタ変数を用意して、$list[$i]を$itemに格納 というような処理を内部でやってくれるものです。まあ、カウンタ変数を外部から参照することは出来ませんけどね。
foreachとforは実行時(コンパイル後)には完全に同じ命令として扱われます。
まあ、その辺は今度、デバッガの使い方を通して命令の流れを知ってもらうつもりなので、分かってくれると思います。


 さて、授業のほうは…。
おもいっきりmy $get = @_; というような構文の穴にはまってしまいましたね。
このばあい、@_がもくろみ通りハッシュリストや配列として受け取られるか、それとも変数として受け取られるかが書き方によって変わってしまいます。
例文上でscalar @listと書きましたが、授業上でこっちの書き方しか教えなかったのもこのため。scalarは引数を強制的にスカラーとして扱う関数ですから、こういう風に書けばかならず配列の要素数が得られます(@listだけでは、場合によっては配列として扱われる)。
こういうの何とかならないんですかねえ、ややこしくってかないません。