我看到這些交替使用。有什麼不同?Perl中'for'和'foreach'有什麼區別?
回答
沒有區別。從perldoc perlsyn:
的
foreach
關鍵詞實際上是用於for
關鍵字的代名詞,所以你可以使用foreach
爲可讀性或for
贅述。
四個字母。
它們是
功能
相同,只是拼寫有所不同。
其實編譯到相同的操作碼。所有的意圖和目的都是一樣的。 – 2010-02-17 14:37:29
自從其introduction in perl-2.0,foreach
已與for
同義。這是對C shell的foreach
命令的點頭。
在我自己的代碼,因爲我使用的是C風格的for循環極少數情況下,我寫
for (my $i = 0; $i < $n; ++$i)
但對於遍歷數組,我拼出來
foreach my $x (@a)
我發現它在我的腦海中讀得更好。
我發現相反:我總是使用'爲我的$ x(@a)'。我更喜歡Python中的''for循環中的x,或者甚至PHP的'for(@a as $ x)'。我從來不使用C風格的'for'循環。我會寫下你對我的$ i(0.. $ n)''所擁有的。 Perl的特例優化,不要創建一個不必要的列表,所以它和你的明確的C風格'for'循環之間的差異應該可以忽略不計,我認爲這種方式更具可讀性。 – 2010-02-17 21:54:49
@Chris Lutz:所以你從來沒有必要去做比1 1更復雜的事情嗎?我可以想到幾種不同的應用程序,其中C風格循環只是編寫它的最佳方式。我現在可以想到的最簡單的情況是希望只用於像for(my $ i = 1; $ i <@x; $ i + = 2){...}' – 2014-06-13 05:24:19
在「for」的情況下,您可以使用三個步驟。
1)初始化 2)條件檢查 3)增量或減量
但在「的foreach」如果你不能夠增加或減少的值。它始終將增量值設爲1.
這是不對。您可以將兩個語法約定與兩個關鍵字(for和foreach)一起使用,而不是關鍵字本身以外的任何其他關鍵字。 – 2014-06-13 05:32:18
它會循環5次打印12345,我們還沒有使用你提到的步驟。 'print $ _ for(1..5)' – 2016-12-20 10:16:37
foreach關鍵字實際上是for關鍵字的同義詞,因此您可以使用foreach來提高可讀性或簡潔性。 (或者因爲Bourne shell比csh更爲熟悉,所以寫作更自然。)如果省略了VAR,則將$ _設置爲每個值。
有細微的差別(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
這也解釋了http://stackoverflow.com/q/5398520/579750和http://stackoverflow.com/q/2238576/579750。 – 2012-02-26 22:17:25
這實際上是一個錯誤的答案,因爲這發生在'for'和'foreach'循環中。你可以自己嘗試 - 如果你在代碼中翻轉'for'和'foreach',什麼都不會發生 – 2012-11-10 03:49:28
你錯了,結果是一樣的:foreach調用foo()打印全局$ var的值(因此1),因爲「for」調用foo()打印本地$ var的值(因此爲10) – 2012-11-14 16:01:05
從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變得非常混亂,如果你 循環體內與剪接添加或刪除元素,例如。 所以不要那樣做。
- 1. 「perl -n」和「perl -p」有什麼區別?
- 2. Perl中的'eq'和'=〜'有什麼區別?
- 3. Perl中BAREWORD和* BAREWORD有什麼區別?
- 4. Perl中$ dxyabc和$ {dxyabc}有什麼區別?
- 5. Perl中grep和map有什麼區別?
- 6. Groovy each和forEach有什麼區別?
- 7. System.Linq中的ForEach和WebGrease.Css.Extensions中的ForEach有什麼區別?
- 8. 「perl test.pl」和「./test.pl」有什麼區別?
- 9. 在Strawberry Perl中,perl \ lib和perl \ site \ lib有什麼區別?
- 10. Eclipse for Java和RCP有什麼區別?
- 11. 爲什麼在for循環中「++ i」和「i ++」有什麼區別?
- 12. 有什麼區別`和$(Bash中有什麼區別?
- 13. onComplete和foreach在Scala中的未來有什麼區別?
- 14. smarty中的{foreach}和{section}有什麼區別?
- 15. 在c#foreach循環中catch {}和catch {continue;}有什麼區別?
- 16. WCF for mobile:有什麼區別
- 17. Perl中的子程序和腳本有什麼區別?
- 18. 在Perl中,`use lib`和`lib-> import`有什麼區別?
- 19. Perl中的\ L和lc函數有什麼區別?
- 20. C和Perl中的system()有什麼區別?
- 21. 在perl中,$ DB :: single = 1和2有什麼區別?
- 22. Perl中詞法和動態範圍界定有什麼區別?
- 23. Perl正則表達式中的\ 1和$ 1有什麼區別?
- 24. perl -d中x和p有什麼區別?
- 25. Perl中的open和sysopen有什麼區別?
- 26. 在Perl中`use base`和@ISA有什麼區別?
- 27. 函數調用和goto&NAME在Perl中有什麼區別?
- 28. Perl 5中父和基有什麼區別?
- 29. 在Perl中,s/^ \ s + //和s/s + $ //有什麼區別?
- 30. Perl中的system,exec和反引號有什麼區別?
+1:welcome to stackoverflow :) – Sarfraz 2010-02-17 09:23:23
他們曾經是獨立的想法,但現在他們是同義詞。 Perl根據()中的內容而不是使用關鍵字指出要做什麼。指責無法輸入額外四個字符的人。 :) – 2010-02-22 00:18:47