2017-05-27 230 views
0
use warnings; 
use strict; 

my $number = 1; 
my %hash = 
(
    key1 => $number, 
    key2 => 'something' 
); 
for (1 .. 10) 
{ 
    print $hash{key1}, "\n"; 
    $number++; 
} 

數字在每一步中都發生變化。預期結果爲1, 2, 3, ..., 10,但實際結果爲1, 1, 1, ..., 1。爲什麼哈希不會改變?哈希值不變

回答

4

您將1分配給變量$number,然後將值$number指定給密鑰爲key1的散列元素。然後在增加$number變量的同時打印該元素十次。

你在「數量」變量不影響哈希提出,因爲你已經指定它,只有除非你寫你的循環這樣的改變$number事後

值的變化,並複製的$number值到哈希每次它改變

for (1 .. 10) { 
    $hash{key1} = $number; 
    print $hash{key1}, "\n"; 
    ++$number; 
} 
+3

或者,如果您希望更改'$ number'直接影響哈希,您可以使用像'key1 => \ $ number'這樣的指針,然後執行'print $ {$ hash {key1}}'來訪問它 – asp

+0

@asp謝謝你的回答我的這個基本問題。我花了一些時間來完成它,但現在我明白了。我瞭解到,有兩種不同的方法 - 傳遞價值和參照。我現在使用'$ number'變量的引用,它運行良好。 – Jeyekomon

2

散列元素的值是在自己的權利的標量

什麼你寫的是這樣

use strict; 
use warnings; 

my $number = 1; 

my $hash_key1 = $number; 
my $hash_key2 = 'something'; 

for (1 .. 10) { 
    print $hash_key1, "\n"; 
    ++$number; 
} 
0

您可以使用標量引用來分配散列值。

use strict; 
use warnings; 
my $number = 1; 
my $hash_key1 = \$number; 
my $hash_key2 = 'something'; 
for (1 .. 10) { 
    print $$hash_key1 "\n"; 
    ++$number;                
} 

取消hash_key。

+0

'在使用中使用「嚴格參考」時,不能使用字符串(「1」)作爲SCALAR參考。' – Jeyekomon

+0

抱歉有一個小錯誤。我現在編輯過 – Harini