perl - 为什么 Perl 的 for() 不遍历数组中的所有元素?

标签 perl loops for-loop

有一个 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 with splice. So don't do that.



请注意,在本文前面,foreach 的语法被描述为 foreach LIST ,这是 LIST他们在文档中提到。另请注意 foreachfor是等价的。

关于perl - 为什么 Perl 的 for() 不遍历数组中的所有元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2014603/

相关文章:

c - 尝试在 C 中使图像在像素级别上变大时获取访问冲突写入位置 0xCDCDCDCD

php - 使用增量值更新表

linux - perl5 数字符号 # 不适用于注释

perl - 我如何比较 Perl 中的 md5 校验和?

perl - 即使在 PATH 上也检查文件是否存在

ruby - ruby 中有一种简单的方法可以调用字符串中的下一个单词吗?

java - 对于字符串长度的循环奇怪地跳过一些字符

regex - Perl 中的否定回顾断言

matlab - 在外部 for 中使用 parfor 的两个循环错误

php - 需要循环逻辑帮助 - 无法正确比较