2017-03-17 92 views
0

我有一個代碼,如下哈希印刷數量

@array = qw(Sam London George Washington Luke Shanghai); 
my %where = @array; 
my @d = keys %where; 
my @c = values %where; 

print "4. keys - @d values - @c \n"; 

我越來越

4. keys - George Luke Sam values - Washington Shanghai London 

我應該得到4鍵 - 薩姆·喬治盧克值 - 倫敦華盛頓上海

然後我有

my ($a) = %where; 
my $b = %where; 
my $c = $b + 1; 
print "6. $a $b $c \n" 

爲什麼我會得到

6. George 2/8 3 

因此,首先,爲什麼我在將數組更改爲哈希值時得到不正確的順序。 其次,我如何得到2/8和3.相反,我期待6和7,因爲散列中有6個元素(3個散列和3個鍵)。

回答

4

哈希不保證以任何特定順序存儲鍵和值。這就是爲什麼@d@c是按照你不指望它們的順序。

2/8是散列在標量上下文中被評估的內容。這在這裏解釋:https://stackoverflow.com/a/7428025/4295017The following reply給出了與perldata相關的引用。

2/8值作爲字符串存儲在$b中。當在整數上下文中計算(由$b + 1操作強加)時,此字符串值將轉換爲2。這就是爲什麼$c3

2

首先,哈希沒有秩序依賴,至少可以說。從keys

哈希條目以明顯隨機的順序返回。實際的隨機順序是特定於給定散列的;兩個哈希上完全相同的一系列操作可能會導致每個哈希的順序不同。   [...]

這是有意完成的,請參閱reason in perlsec。你可以sort他們打印或分配。

另一個問題是由於在標量上下文中使用了散列。從perldata

如果您評估標量上下文中的散列值,它將在散列值爲空時返回false。如果有任何鍵/值對,則返回true;更準確地說,返回的值是一個字符串,由使用的存儲段數和分配的存儲段數組成,並由斜槓分隔。

該文檔的其餘部分將進一步解釋它。

如果您希望對數分配keys %h標量,或使用scalar上。