2014-04-28 105 views
4

我觉得有一些我没有得到关于perl的循环机制。C风格的循环vs 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风格,但我仍然喜欢我的循环。

+0

有另一种机制,我可以使用(除了c风格),每次迭代后评估? – LukeP

+0

相关:http://stackoverflow.com/questions/23175022/what-am-i-not-getting-about-foreach-loops – mob

+0

是的,绝对相关,但不是重复。另一个人没有意识到使用foreach时,$ _变量指的是实际的字符串而不是索引。我的问题是不同的。 – LukeP

回答

9

$i<=$#arr在每个循环之前评估,而(0 .. $#arr)在任何循环之前评估一次。

因此,第一个代码不会“看到”对@arr大小的更改。

+0

是否有另一种语法可以用来在每次迭代之后强制进行评估? (除了使用c-style) – LukeP

+1

@LukeP,其他方式有很多种。也许如果你告诉我们你想要避免的C风格怎么样。 – ikegami

+0

一个'for'循环是说我不管做什么都会做这个'X'次。 _C Style For Loops_的问题是这不是真的。它们仅仅是''循环衣物'的'while'循环。如果你需要改变你循环的方式,你应该真的把它变成一个“while”循环,所以人们知道它。 (顺便说一句,这里不包括'last',它实际上只是一个_get无循环免费card_。你可以用'last'语句来设置'for'循环。) –

2

另一种方法是do-while构造,虽然它有点笨拙。

my $i; 
do { 
    push @arr, $value if condition; 
} while ($i++ < @arr); 
+0

是的,我想到了,谢谢。我会坚持我的c循环来完成这些任务。我问的原因是因为我在另一个网站上发布了一些代码,并因使用c循环而被咀嚼。他们告诉我切换到Perl风格,所以我做了,只是为了找出perl循环不起作用。哈哈 – LukeP

+0

@LukeP对不起,你必须采取的耳朵颠簸。是的,perl样式循环几乎总是首选,特别是在使用迭代器等时。然而,如果你要修改循环的结构,那么'for(;;)'或'while'就是你所需要的。 – Miller

3

有另一种语法,我可以使用,将在每次迭代后强制评估? (除了使用C风格)

for (my $i=0; $i<=$#arr; $i++) { 
    ... 
} 

是写

my $i=0; 
while ($i<=$#arr) { 
    ... 
} continue { 
    $i++; 
} 

的只是另一种方式(除了的$i范围略有不同。)