如何使数组无限期循环?

内嫩

我有一个名字列表:

@names = qw(John Peter Michael);

我想从中取两个值,所以我得到了约翰和彼得。如果我想再拿2个,我会选Michael和John。还有1个-彼得。另外3个-Michael John和Peter,依此类推。

我已经开始编写一个子例程,在该例程中将设置并记住全局索引ID,并在达到数组的标量限制时将其自身重置为零,但是随后我读到某个地方,Perl数组“记住”了循环的位置。

那是真的还是我误会了什么?有没有一种简单的方法可以完成我的任务?

扎伊德

推出自己的迭代器并不难,但perlfaq4可以满足您的需求:


如何处理循环清单?

(由brian d foy贡献)

如果要无休止地遍历数组,可以对数组中元素的数量取模来增加索引:

my @array = qw( a b c );
my $i = 0;
while( 1 ) {
    print $array[ $i++ % @array ], "\n";
    last if $i > 20;
} 

您也可以使用Tie::Cycle标量,该标量始终具有圆形数组的下一个元素:

use Tie::Cycle;
tie my $cycle, 'Tie::Cycle', [ qw( FFFFFF 000000 FFFF00 ) ];
print $cycle; # FFFFFF
print $cycle; # 000000
print $cycle; # FFFF00

Array::Iterator::Circular创建用于圆形阵列的迭代器对象:

use Array::Iterator::Circular;
my $color_iterator = Array::Iterator::Circular->new(
    qw(red green blue orange)
    );
foreach ( 1 .. 20 ) {
    print $color_iterator->next, "\n";
}

自己动手做的品种

该子例程非常简单(如circularize下面的代码中所示)。的值$i保留在$colors的范围内,因此不需要状态变量:

sub circularize {
  my @array = @_;
  my $i = 0;
  return sub { $array[ $i++ % @array ] }
}

my $colors = circularize( qw( red blue orange purple ) ); # Initialize

print $colors->(), "\n" for 1 .. 14; # Use

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章