Perl的foreach
循環操作符是否需要按順序呈現列表項?Perl,foreach訂單
例如
my @a=(1,2,3);
foreach my $item (@a) {
print $item;
}
將總是打印1 2 3?
我懷疑是這樣,但我找不到它記錄。
Perl的foreach
循環操作符是否需要按順序呈現列表項?Perl,foreach訂單
例如
my @a=(1,2,3);
foreach my $item (@a) {
print $item;
}
將總是打印1 2 3?
我懷疑是這樣,但我找不到它記錄。
是的,它會的。數組和列表已訂購。
是的,數組保持順序,而哈希不。
是的。
一些明顯的複雜性(數組排列順序,但哈希不是 - 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()
並遍歷結果。
請注意散列中的鍵的順序是未定義的並且沒有排序。列表總是在他們使用的任何地方排序。 – Daenyth 2010-06-15 16:32:28
不只是未定義,但明確隨機在最近版本的Perl增加安全 – 2010-06-15 23:56:18
@Eric我會咬:什麼是安全性的關注? – Telemachus 2010-06-16 00:18:04