2010-02-17 90 views
24

我看到這些交替使用。有什麼不同?Perl中'for'和'foreach'有什麼區別?

+0

+1:welcome to stackoverflow :) – Sarfraz 2010-02-17 09:23:23

+4

他們曾經是獨立的想法,但現在他們是同義詞。 Perl根據()中的內容而不是使用關鍵字指出要做什麼。指責無法輸入額外四個字符的人。 :) – 2010-02-22 00:18:47

回答

32

沒有區別。從perldoc perlsyn

foreach關鍵詞實際上是用於for關鍵字的代名詞,所以你可以使用foreach爲可讀性或for贅述。

12

我看到這些交替使用。

除語法之外沒有區別。

+1

+1是的,Perl在語法糖方面非常豐富。有更多然後說一個方法。 – Thilo 2010-02-17 09:22:56

+0

@Thilo:同意:) – Sarfraz 2010-02-17 09:23:50

+0

@SinanÜnür:謝謝:) – Sarfraz 2010-02-18 04:48:05

5

四個字母。

它們是 功能 相同,只是拼寫有所不同。

+0

其實編譯到相同的操作碼。所有的意圖和目的都是一樣的。 – 2010-02-17 14:37:29

3

自從其introduction in perl-2.0,foreach已與for同義。這是對C shell的foreach命令的點頭。

在我自己的代碼,因爲我使用的是C風格的for循環極少數情況下,我寫

for (my $i = 0; $i < $n; ++$i) 

但對於遍歷數組,我拼出來

foreach my $x (@a) 

我發現它在我的腦海中讀得更好。

+2

我發現相反:我總是使用'爲我的$ x(@a)'。我更喜歡Python中的''for循環中的x,或者甚至PHP的'for(@a as $ x)'。我從來不使用C風格的'for'循環。我會寫下你對我的$ i(0.. $ n)''所擁有的。 Perl的特例優化,不要創建一個不必要的列表,所以它和你的明確的C風格'for'循環之間的差異應該可以忽略不計,我認爲這種方式更具可讀性。 – 2010-02-17 21:54:49

+1

@Chris Lutz:所以你從來沒有必要去做比1 1更復雜的事情嗎?我可以想到幾種不同的應用程序,其中C風格循環只是編寫它的最佳方式。我現在可以想到的最簡單的情況是希望只用於像for(my $ i = 1; $ i <@x; $ i + = 2){...}' – 2014-06-13 05:24:19

-3

在「for」的情況下,您可以使用三個步驟。

1)初始化 2)條件檢查 3)增量或減量

但在「的foreach」如果你不能夠增加或減少的值。它始終將增量值設爲1.

+0

這是不對。您可以將兩個語法約定與兩個關鍵字(for和foreach)一起使用,而不是關鍵字本身以外的任何其他關鍵字。 – 2014-06-13 05:32:18

+0

它會循環5次打印12345,我們還沒有使用你提到的步驟。 'print $ _ for(1..5)' – 2016-12-20 10:16:37

0

foreach關鍵字實際上是for關鍵字的同義詞,因此您可以使用foreach來提高可讀性或簡潔性。 (或者因爲Bourne shell比csh更爲熟悉,所以寫作更自然。)如果省略了VAR,則將$ _設置爲每個值。

-2

有細微的差別(http://perldoc.perl.org/perlsyn.html#Foreach-Loops):

在正常列表值

foreach循環迭代,並把變量VAR是反過來的列表的每個元素。如果變量前面帶有關鍵字my,那麼它在詞彙範圍內,因此僅在循環內可見。否則,該變量對於循環隱式地是局部的並且在退出循環時重新獲得其以前的值。如果該變量先前是用my聲明的,則它使用該變量而不是全局變量,但它仍然是本地化的。這種隱式本地化只發生在foreach循環中。

這個程序:

#!/usr/bin/perl -w 

use strict; 

my $var = 1; 
for ($var=10;$var<=10;$var++) { 
    print $var."\n"; # print 10 
    foo(); # print 10 
} 

print $var."\n"; # print 11  

foreach $var(100) { 
    print $var."\n"; # print 100 
    foo(); # print 11 ! 
} 

sub foo { 
    print $var."\n"; 
} 

將產生:

10 
10 
11 
100 
11 
+1

這也解釋了http://stackoverflow.com/q/5398520/579750和http://stackoverflow.com/q/2238576/579750。 – 2012-02-26 22:17:25

+1

這實際上是一個錯誤的答案,因爲這發生在'for'和'foreach'循環中。你可以自己嘗試 - 如果你在代碼中翻轉'for'和'foreach',什麼都不會發生 – 2012-11-10 03:49:28

+0

你錯了,結果是一樣的:foreach調用foo()打印全局$ var的值(因此1),因爲「for」調用foo()打印本地$ var的值(因此爲10) – 2012-11-14 16:01:05

0

http://perldoc.perl.org/perlsyn.html#Foreach-Loops

在foreach關鍵字實際上是針對關鍵字的代名詞,所以你 也可以使用。如果省略VAR,則將$ _設置爲每個值。

# Perl's C-style 
for (;;) { 
    # do something 
} 

for my $j (@array) { 
    print $j; 
} 

foreach my $j (@array) { 
    print $j; 
} 

但是:

如果LIST的任何部分是一個數組,會的foreach變得非常混亂,如果你 循環體內與剪接添加或刪除元素,例如。 所以不要那樣做。

相關問題