2013-08-22 74 views
3

我有一個哈希my %read_data =();爲什麼將Perl哈希值添加爲關鍵字?

我試圖建立這樣

$read_data{"status"} = 0; 
$read_data{"suffix"} = "_SP"; 
$read_data{"consumption"} = 95; 

我所看到的是如下鍵和值,我想不出什麼我做錯了。

Key=status 
Key=0 
Key=suffix 
Key=_SP 
Key=consumption 
Key=95 

我使用

for my $k1 (%read_data) 
{ 
    print "Key=".$k1."\n"; 
} 
+2

您向我們展示了您的輸入,但不是用於生成輸出的代碼。 – Quentin

+0

我忘了keys關鍵字以及生成調試輸出的內容。所有照顧在OP。 – octopusgrabbus

+1

'使用Data :: Dumper;打印Dumper(\%read_data);' – toolic

回答

6

有之間的關係陣列和散列:

my %hash = (one => 1, two => 2, three => 3); 

這創建在3成員散列,密鑰爲one,two和`三。那麼是這樣的:

my %hash = ("one", 1, "two", 2, "three", 3); 

其實這兩條語句完全一樣。 =>是一種形式句法糖用於突出顯示一個值與另一個值之間的關係。再次是同一行。我只是在這一個你的大腦搞亂,但它會產生相同的散列爲前:

my %hash = ("one", 1 => "two", 2 => "three", 3); 

這裏的分配相同的哈希值的另一種方式:

my @array = ("one", 1, "two", 2, "three", 3); 
my %hash = @array; 

,這也是有效的太:

my @array = %hash; 

在Perl中哈希和數組之間有很強的關係。如果你在一個哈希上下文中使用一個數組,它就變成了一個哈希。如果你在數組上下文中使用散列,它將成爲一個數組。 例如:

mysub (%hash); 

sub mysub { 
    my %subhash = @_; 
    ... 
} 

這是通過散列到的子程序的有效(儘管不是推薦的方法)。散列被翻譯成@_數組,然後在子例程中被轉換回散列。

讓我們來看看你的循環:

for my $k1 (%read_data) { 

(...)是一個列表/陣列的情況下,從而將您的%read_data哈希,並在列表環境中,每個關鍵其次是目前它其

有幾種方法可以解決這個問題。一種方法是使用keys提取散列中的所有密鑰並返回密鑰數組。這通常與sort相結合,將鍵排列成某種秩序的外表。

for my $k1 (sort keys %read_data) { 

另一種是用它返回一系列具有一個密鑰和一個值的兩個構件陣列的each

+1

沒有這樣的「哈希上下文中的數組」。當你說'my%hash = @ array'時,你正在使用一個數組來_initialize_一個散列。 –

+0

關於唯一我要補充的是,有時候你不需要知道密鑰,而且順序無關緊要。在這種情況下,您只需循環['values'](http://perldoc.perl.org/functions/values.html)。 –

6

雖然這將需要你發佈你的代碼,使某些操作時,輸出判斷你似乎是迭代散列,就好像是陣列式打印此; Perl會讓你做到這一點,但它幾乎從來沒有你想要的。相反,嘗試這樣的事:

foreach my $key (keys %read_data) { 
    my $value = $read_data{$key}; 
    print "$key = $value\n"; 
}; 
3

使用foreach通過散列會得到它的鍵和值順序,所以不這樣做。

這爲我工作:

while (my ($k, $v) = each %read_data) { 
    print "$k = $v\n"; 
} 

(我大大喜歡讓哈希而不是哈希然後不得不再次擡頭。)

相關問題