Arrays 如何使数组无限循环?

Arrays 如何使数组无限循环?,arrays,perl,loops,infinite-loop,Arrays,Perl,Loops,Infinite Loop,我有一份名单: @names = qw(John Peter Michael); 我想从中取两个值,得到John和Peter。如果我还想再拿两个,我会得到迈克尔和约翰。还有一个——彼得。还有3个——迈克尔·约翰和彼得,等等 我已经开始编写一个子程序,其中将设置并记住全局索引ID,一旦它达到数组的标量限制,就会将自身重置为零,但后来我在某个地方读到Perl数组“记住”了它们循环的位置 这是真的还是我误解了什么?有没有一种简单的方法来完成我的任务?使用自己的迭代器并不难,但是您的需求已经满足了:

我有一份名单:

@names = qw(John Peter Michael);
我想从中取两个值,得到John和Peter。如果我还想再拿两个,我会得到迈克尔和约翰。还有一个——彼得。还有3个——迈克尔·约翰和彼得,等等

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


这是真的还是我误解了什么?有没有一种简单的方法来完成我的任务?

使用自己的迭代器并不难,但是您的需求已经满足了:


如何处理循环列表? (布莱恩·福伊撰稿)

如果要在数组中无休止地循环,可以增加 按数组中元素数的模索引:

my @array = qw( a b c );
my $i = 0;
while( 1 ) {
    print $array[ $i++ % @array ], "\n";
    last if $i > 20;
} 
还可以使用始终具有圆形数组的下一个元素的标量:

use Tie::Cycle;
tie my $cycle, 'Tie::Cycle', [ qw( FFFFFF 000000 FFFF00 ) ];
print $cycle; # FFFFFF
print $cycle; # 000000
print $cycle; # FFFF00
为循环数组创建迭代器对象:

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

这卷是你自己的品种 子例程非常简单(在下面的代码中实现为
循环
)。
$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

我从来没有完全理解过这种机制(只是在foreach上?)。我只会使用状态值,例如:

my @names = qw(John Peter Michael);

sub GetNames($) {
  my $count = shift;
  my @result = ();

  state $index = 0;
  state $length = scalar(@names);

  while($count--) {
    push(@result, $names[($index++ % $length)]);
  }
  return @result;
}


print join(", ", GetNames(2)), "\n\n";
print join(", ", GetNames(4)), "\n";
产出:

约翰,彼得


Michael,John,Peter,Michael

查看我的答案,了解如何不依赖
状态
变量调用
使用功能“状态”(或
使用v5.10;
)@扎伊德,我喜欢你的答案(+1),但对于
状态
功能,它在概念上比闭包更简单。在子系统中依赖全局
@names
,会限制其使用。
$length
不需要是
状态
,也不需要
标量
,只需要
my$len=@names。我不认为在这里使用原型有什么好处(示例中也没有使用)。。。不是很有用的代码片段@Zaid的代码显然更倾向于重用。我确实喜欢roll your own方法,尽管它需要稍微调整以满足获得N个元素的原始规范。我本想做些类似的事情,但我脑子里的状态突然出现在页面上。很不错的。