我觉得perl的循环机制有些地方我不了解。
据我所知,
for my $j (0 .. $#arr){...}
在功能上等同于:
for(my $i=0; $i<=$#arr; $i++){..}
然而,在我的代码中,它们的操作方式似乎有一些细微的差异。特别是他们决定何时终止的时间。例如:
假设@arr是用一个变量初始化的。
这两个区块应该做同样的事情,对吧?
for my $i (0 .. $#arr)
{
if(some condition that happens to be true)
{
push(@arr, $value);
}
}
和
for (my $i=0; $i<=$#arr; $i++)
{
if(some condition that happens to be true)
{
push(@arr, $value);
}
}
然而,在执行中,即使在这两种情况下都推送了一个新值,第一个循环也会在一次迭代后停止。
这应该发生吗?如果是,为什么?
编辑:感谢您的回答,我知道我可以用其他循环机制完成同样的事情。当我问是否还有其他语法时,我特别谈到了使用for。显然没有。因为我想要做的语法已经用c风格实现了。我之所以这么问,是因为我被告知要避免c风格,但我仍然喜欢我的for循环。
$i<=$#arr
在每个循环之前求值,而(0 .. $#arr)
在任何循环之前求值一次。
因此,第一个代码不会"看到"@arr
大小的更改。
有没有其他语法可以在每次迭代后强制进行求值?(除了使用c型(
for (my $i=0; $i<=$#arr; $i++) {
...
}
只是编写的另一种方式
my $i=0;
while ($i<=$#arr) {
...
} continue {
$i++;
}
(除了$i
的范围略有不同。(
另一种选择是do-wile构造,尽管它有点笨拙。
my $i;
do {
push @arr, $value if condition;
} while ( $i++ < @arr );