有一个 perl 脑筋急转弯:
my @l = ('a', 'b', 'c');
for (@l) {
my $n = 1;
print shift @l while (@l and $n --> 0);
print "\n";
}
印的是什么?应该是a、b、c吧?但是等等,实际上某个地方有一个错误,它只打印 a 和 b。可能只是一些愚蠢的脱单,应该很容易解决吧?
好的,所以做一个小的代码更改来测试一下并将@l 更改为
my @l = ('a', 'b', 'c', 'd');
印的是什么?可能是因为 a、b 和 c 是因为那个愚蠢的一个,对吧? ...等一下,实际上它仍然只打印 a 和 b。好的,所以错误在于它只打印前两个字符。
再次将@l 更改为
my @l = ('a', 'b', 'c', 'd', 'e');
嗯,现在它打印 a、b 和 c。但不是 d 或 e。事实上,我们从现在开始每添加 2 个字母,它就会打印序列中的下一个字母。因此,如果我们添加 f,它仍然只会打印 a、b 和 c,但是如果我们添加 f 和 g,它将打印 a、b、c 和 d。
对于不同的 $n 值,这种情况也会发生类似的结果。
那么这里发生了什么?
最佳答案
Dave Webb解决了我的问题,但这里引用了 perldoc perlsyn
说不要这样做:
If any part of LIST is an array,
foreach
will get very confused if you add or remove elements within the loop body, for example withsplice
. So don't do that.
请注意,在本文前面,
foreach
的语法被描述为 foreach LIST
,这是 LIST
他们在文档中提到。另请注意 foreach
和 for
是等价的。
关于perl - 为什么 Perl 的 for() 不遍历数组中的所有元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2014603/