2014-04-28 48 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範圍略有不同。)