2010-06-15 62 views
11

Perl的foreach循環操作符是否需要按順序呈現列表項?Perl,foreach訂單

例如

my @a=(1,2,3); 

foreach my $item (@a) { 
print $item; 
} 

將總是打印1 2 3?

我懷疑是這樣,但我找不到它記錄。

回答

14

是的。它按列表順序進行迭代。只要它被記錄,看perldoc perlsyn

超過正常列表值

foreach循環迭代,並把變量VAR 是反過來的列表的每個元素。

「反過來」這裏意味着按順序。

+10

請注意散列中的鍵的順序是未定義的並且沒有排序。列表總是在他們使用的任何地方排序。 – Daenyth 2010-06-15 16:32:28

+0

不只是未定義,但明確隨機在最近版本的Perl增加安全 – 2010-06-15 23:56:18

+0

@Eric我會咬:什麼是安全性的關注? – Telemachus 2010-06-16 00:18:04

3

是的,它會的。數組和列表已訂購。

3

是的,數組保持順序,而哈希不。

7

是的。

一些明顯的複雜性(數組排列順序,但哈希不是 - WTF?)來自大多數答案忽略了上下文的重要性的事實。

取決於上下文,Perl變量,函數,運算符和子例程可以評估不同的值。上下文可以是標量列表

在標量環境中,我們只需要一個值。例如,my $count = @array;@array中的元素數量指定爲$count,因爲對標量的賦值提供了標量上下文。

在列表上下文中,我們正在尋找多個值。例如,my @merged = @left, @right;。賦值給數組提供了列表上下文,因此@left@right被擴展爲它們元素的列表。由於列表是扁平結構,因此我們有一個長列表,它將兩個數組的元素組合在一起。最後,值的列表被分配給@merged

大部分答案都掩蓋了這一點的原因是,儘管上下文似乎很奇怪,但99%的時間環境透明地工作,並且達到您期望的效果。

for循環提供了一個列表上下文。這意味着括號內的任何內容都將在列表上下文中進行解釋。結果列表然後按順序迭代。

這意味着的是:

  • for (@array) {}陣列擴展到元素列表,保存陣列的順序。
  • for (%hash) {}將散列展開爲隨機排列的鍵/值對列表。
  • for (<FILEHANDLE>) {}讀取文件句柄中可用的所有行並按順序顯示它們。
  • for (some_subroutine()) {}在列表上下文中評估some_subroutine()並遍歷結果。