2017-08-07 60 views
0

我是perl的新手。我無法理解以下代碼的輸出。perl中'++'運算符的行爲

my %fruit_color = (apple => "red", banana => "yellow", grape => "purple"); 

my @fruits = keys %fruit_color; 
my @colors = values %fruit_color; 

print "The color of apple is ", $fruit_color{"apple"}, "\n"; 

$cnt = 0; 
while ($cnt < @fruits) { 
    print $fruits[$cnt ++], " "; 
} 
print "\n"; 
$cnt = 0; 
while ($cnt < @colors) { 
    print $colors[$cnt ++], " "; 
} 

輸出粘貼在這裏:

The color of apple is red 
grape banana apple 
purple yellow red 

但是,如果我改變了我的代碼是這樣的:

my %fruit_color = (apple => "red", banana => "yellow", grape => "purple"); 

my @fruits = keys %fruit_color; 
my @colors = values %fruit_color; 

print "The color of apple is ", $fruit_color{"apple"}, "\n"; 

$cnt = 0; 
while ($cnt < @fruits) { 
    print $fruits[$cnt], " "; # DIFF HERE ! 
    $cnt ++; 
} 
print "\n"; 
$cnt = 0; 
while ($cnt < @colors) { 
    print $colors[$cnt ++], " "; 
} 

輸出將是:

The color of apple is red 
apple grape banana 
red purple yellow 

我無法理解這些考試之間的區別特別是爲什麼第一個while循環的變化會影響第二個循環。有誰能告訴我爲什麼輸出是顛倒的?非常感謝。

+2

[爲什麼哈希鍵有打印時不同的順序?](https://stackoverflow.com/questions/30340027/why-do-hash-keys-have-different-order - 打印時) – mkHun

+1

「問題」不是你的「++」調用。這很完美。但是調用'keys%fruit_color;'以某種任意順序返回哈希鍵,並且不能依賴它在不同腳本運行之間相同。從[docs](http://perldoc.perl.org/functions/keys.html):_「哈希條目以明顯隨機的順序返回。」_ – PerlDuck

回答

0

幾乎所有的編程語言都有一個類似的++運算符(和相應的--運算符)。它被稱爲前增量和後增量。 ++$foo的作品類似{ $foo += 1; return $foo; },但++$foo是更有趣的版本。立即增加$foo,但返回以前的值。這使得很多簡單的數學運算可以縮短很多,因爲您可以指定在修改之前還是之後要獲取值。

4

問題不在你的增量中。問題在於哈希。在計算機內存中,哈希值不存儲在你聲明什麼順序相同,例如

my @fruits = keys %fruit_color; 
print @fruits; 

如果你運行該腳本比時間更和監視輸出它會給不同的輸出。

哈希和數組都是相同的,但有一些區別,即設置鍵(在我們稱之爲索引的數組中,我們稱之爲索引,在哈希中稱爲鍵)。

無論你想要什麼名字,你可以把它作爲關鍵和存儲的價值。但是數組只能通過索引值訪問數據。

因此,將項目排列在數組中非常重要,因爲您正在通過其索引值進行訪問。但是沒有必要將項目安排在哈希中,因爲您已經設置了密鑰。

更多infoperldoc