如何无限制地进行数组循环?

Ne *_*nne 3 arrays perl loops infinite-loop

我有一个名单:

@names = qw(John Peter Michael);
Run Code Online (Sandbox Code Playgroud)

我想从中获取2个值,所以我得到约翰和彼得.如果我想再拿两个 - 我得到迈克尔和约翰.还有1个 - 彼得.还有3个 - 迈克尔约翰和彼得,等等.

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

这是真的还是我误解了什么?有没有办法轻松完成我的任务?

Zai*_*aid 6

滚动自己的迭代器并不难,但perlfaq4需要满足您的需求:


如何处理循环列表?

(由brian d foy提供)

如果要循环遍历数组,可以将索引增量模数组中的元素数量:

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

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

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

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";
}
Run Code Online (Sandbox Code Playgroud)

滚动自己的品种

子程序非常简单(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
Run Code Online (Sandbox Code Playgroud)