前述のように、for(each)は熱心なループであるため、開始する前にリスト全体を評価する必要があります。
簡単にするために、遅延評価された配列を作成するのではなく、イテレーターオブジェクトまたはクロージャーを使用することをお勧めします。ネクタイを使用して遅延評価された無限リストを作成することはできますが、リスト全体(またはリスト全体のサイズ)を(上記のforeachのように直接的または間接的に)要求すると、問題が発生する可能性があります。
フルクラスを記述したり、モジュールを使用したりすることなく、クロージャを使用するだけで単純なイテレータファクトリを作成できます。
sub make_iterator {
my ($value, $max, $step) = @_;
return sub {
return if $value > $max; # Return undef when we overflow max.
my $current = $value;
$value += $step; # Increment value for next call.
return $current; # Return current iterator value.
};
}
そしてそれを使用するには:
# All the even numbers between 0 - 100.
my $evens = make_iterator(0, 100, 2);
while (defined( my $x = $evens->() ) ) {
print "$x\n";
}
CPANにはTie::Array :: Lazyモジュールもあります。これは、レイジーアレイへのはるかに豊富で充実したインターフェイスを提供します。私は自分でモジュールを使用したことがないので、マイレージは異なる場合があります。
ではごきげんよう、
ポール