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()した一時配列を作るのではなく、イテレータを逆に進めることで対応しているようだ。

*1:なお、バージョン0.02でインターフェイスが変わっている。

*2:バージョン0.01ではiter_inc()という名前だった。