B::Foreach::Iteratorでforeachイテレータを進める
B::Foreach::Iteratorというモジュールを書いた*1。
use B::Foreach::Iterator 0.02; foreach my $key(foo => 10, bar => 20, baz => 30){ printf "%s => %s\n", $key => iter->next; }
iter->next()*2はforeachループのイテレータをひとつ進め、その値を返す。
また、iter->peek()はイテレータを進めることなく、次のイテレータを返す。
このモジュールを実装するにあたってpp_hot.cのpp_iter()を読んだのだが、確かにforeach ($min .. $max)は内部で配列を生成していない。また、foreach (reverse ...)についても最適化が行われており、reverse()した一時配列を作るのではなく、イテレータを逆に進めることで対応しているようだ。