2017-05-06 82 views
1

我試圖生成散列的列表,使用下面的腳本與用戶交互的數組時:錯誤訪問哈希

use strict; 
use warnings; 

my $KEY_1 = "one"; 
my $KEY_2 = "two"; 


sub generateHash{ 
    my ($value1, $value2) = (@_); 

    $value2 = $value1 + 5.0; 

    my %hash = {}; 

    $hash{$KEY_1} = $value1; 
    $hash{$KEY_2} = $value2; 

    return %hash; 
} 

print "Num: \n"; 
my $number = <>; 

my @hashes =(); 
my %new_hash = {}; 

for (my $i = 1; $i < $number + 1; $i = $i + 1) { 

    print "Enter the values $i \n"; 

    print "value 1: "; 
    my $value1= <>; 

    print "\nvalue 2: "; 
    my $value2= <>; 

    chomp $value1; 
    chomp $value2; 

    %new_hash = generateHash($value1, $value2);  

    push (@hashes, %new_hash); 
    print "@hashes\n"; 
} 

my %test = $hashes[0]; 
my @keys = keys %test; 
my @values = values %test; 

print "@keys\n"; 
print "@values\n"; 

當我嘗試執行程序,它提出了一些相關的錯誤訪問數組中的哈希時使用引用。我錯過了一些東西,但我看不到是什麼,我想知道我在哪裏訪問哈希引用。謝謝你在前進,連接從運行的輸出:

Num: 
1 
Reference found where even-sized list expected at generate_hashes.pl line 21, <> line 1. 
Enter the values 1 
value 1: 1 

value 2: 1 
Reference found where even-sized list expected at generate_hashes.pl line 12, <> line 3. 
Use of uninitialized value $hashes[1] in join or string at generate_hashes.pl line 32, <> line 3. 
HASH(0x2587a88) one 1 two 6 
Odd number of elements in hash assignment at generate_hashes.pl line 34, <> line 3. 
HASH(0x2587a88) 
Use of uninitialized value $values[0] in join or string at generate_hashes.pl line 38, <> line 3. 

回答

2

參考找到預期在generate_hashes.pl線甚至大小列表21,<> 1號線

這一個是由於到

my %new_hash = {}; 

空的大括號{}提供一個空的散列的引用,但在左手邊你有一個哈希,而不是一個參考。您可以改爲使用初始化:

my %new_hash =(); 

但(作爲註釋)你不知道在實踐中需要初始化,如果你想開始一個空的哈希值;這是默認設置。

參考發現,甚至大小列表預期在generate_hashes.pl線12,<>線3

相同的故障與上述generateHash函數內。

在這一行:

push (@hashes, %new_hash); 

我懷疑你打算到哈希參考推入陣,要做到這一點,你需要添加一個\

push(@hashes, \%new_hash); 

否則你」將整個數據結構放在陣列中等。

在這一行:

my %test = $hashes[0]; 

你的右手邊是一個標量,一個散列的引用,因此,您需要解引用,以使用散列分配:

my %test = %{$hashes[0]}; 

消息像

HASH(0x2587a88)

從這一行來:

打印 「@hashes \ n」;

不確定你的意圖是否存在,但是如果你想查看內容(它將是一個哈希引用數組),你需要迭代數據結構。您可以考慮使用Data :: Dumper模塊來幫助您查看其中的內容。

+1

'my @foo =();我的%bar =();'是多餘的。你可以寫'我的@foo;我的%吧;'而是。 – melpomene

+0

非常感謝,它現在有效。沒有意識到我正在用大括號初始化參考。我現在看到的事情更清晰:)並感謝提議使用Dumper。 – Hellzzar