C样式循环与Perl循环(在Perl中)



我觉得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 );

最新更新