2014-12-31 216 views
0

所以我想使用Perl HoH並將一些值從HoH中推入一個數組。Perl哈希哈希

下面是代碼的一部分,以便更好地解釋;

my $hoh = (
antenna_included=>{ 
    "1" => '1 MultiBand Antenna', 
    "2" =>'2 Multiband Antennas', 
    "3" =>'1 MultiBand Antenna & 2 WiFi Antennas', 
    "4" =>'2 Multiband Cellular Antennas & 2 WiFi Antennas', 
    "N" =>'No Antennas Included', 
    }, 
ip_rating=>{ 
    I6 => 'IP 64', 
    CD => 'Intrinsically Safe, Class 1 Div 2, IP 64', 
    NI => 'No', 
    }); 

foreach $group (sort keys %hoh) { 
    foreach $spec (sort keys %{ $hoh{$group} }) { 
     print "$spec=>$hoh{$group}{$spec}\n"; 
    } 

    print "what part is it: "; 
    my $input = <STDIN>; 
    chomp $input; 

    if (exists $hoh{$group}) { 
     print "$hoh{$spec}\n";    #this is the problematic line. 
    } 
    else { 
    print "not a match!\n"; 
    } 
} 

基本上這個腳本的目標是通過可可西里循環,但在整個哈希的每一塊它給STDIN,那麼你在key類型,然後後來我想該元素的value推入數組。 (現在代碼只是說print用於調試)。

我已經試過

$hoh{$group}{$spec} 
$hoh{$group} 
$hoh{$group}->{$spec} 

對於$hoh{$group}我得到HASH(0x6ff920)和所有其他價值,這只是空白,沒有錯誤。

有什麼想法?謝謝

回答

2

使用->運算符。

HoH下面的所有內容都是散列表ref,訪問它們的元素需要運算符->。 (從技術上講,你有一個「散列hashref」而不是「散列散列」,因爲這樣的事情是不可能的。)

有關引用的詳細信息,請參閱perlref文檔。

$hoh{$group}->{$spec} 

UPDATE

這是你的程序的修改版本。區別是:

  • %hoh初始宣佈與散列變量%hoh,而不是標量,$hoh完成。將初始化列表分配給$hoh將導致列表的最後一個元素被分配給該變量,在這種情況下,該hashref對應於ip_rating。這幾乎肯定不是你想要的。
  • 試圖訪問$hoh{$group}的元素需要->運算符,如`$ hoh {$ group} - > {$ spec}。
  • 問題區域可能需要檢查是否存在$hoh{$group}->{$input}。如果它不存在,則輸入無效,這就是消息所暗示的。

你只需要理解一個哈希和一個hashref(類似於一個數組和一個arrayref之間的區別),並意識到哈希和數組不能是其他哈希或數組的元素。哈希ref s和數組ref s可以是其他數據結構的元素,因爲只有標量可以包含在另一個數據結構中。散列和數組不是標量,但引用是標量(包括hashref,arrayrefs,coderefs,甚至是標量引用),並且是創建任何類型的複雜嵌套數據結構所必需的。


my %hoh = (
    antenna_included=>{ 
     "1" => '1 MultiBand Antenna', 
     "2" =>'2 Multiband Antennas', 
     "3" =>'1 MultiBand Antenna & 2 WiFi Antennas', 
     "4" =>'2 Multiband Cellular Antennas & 2 WiFi Antennas', 
     "N" =>'No Antennas Included', 
    }, 
    ip_rating=>{ 
     I6 => 'IP 64', 
     CD => 'Intrinsically Safe, Class 1 Div 2, IP 64', 
     NI => 'No', 
    }); 

foreach $group (sort keys %hoh) { 
    foreach $spec (sort keys %{ $hoh{$group} }) { 
     print "$spec=>$hoh{$group}->{$spec}\n"; 
    } 

    print "what part is it: "; 
    my $input = <STDIN>; 
    chomp $input; 

    if (exists $hoh{$group}->{$input}) { 
     print $hoh{$group}->{$input}."\n"; 
    } 
    else { 
     print "not a match!\n"; 
    } 
} 
+0

感謝迴應和參考。這並不奏效(至少只是將其添加到一個「有問題」的行)。你認爲這可能是因爲我需要在'for'循環上面使用' - >'運算符,然後我才能引用它? – nzaleski

1

牙套{...}和括號(...)是非常不同影響。第一個定義了一個匿名散列,您將分配給一個標量變量,而第二個定義一個列表,您將分配給一個散列變量。你有兩種混合,你不清楚你的意思。

  • 如果你有變量$hoh,那麼你需要用

    my $hoh = { ... } 
    

    初始化,並與間接運算符

    $hoh->{$group}->{$spec} 
    

    $hoh->{$group}{$spec} 
    
    訪問元素
  • 如果你有哈希變量,那麼你需要用

    my %hoh = (...) 
    

    其初始化並訪問元素直接

    $hoh{$group}->{$spec} 
    

    $hoh{$group}{$spec} 
    
+1

@mojo:'perl -E'%hoh =(G => {S => works}); ($ group,$ spec)= qw/G S /;說$ hoh {$ group} {$ spec}'' – Borodin

+0

我站好了。我不明白爲什麼,如果'$ hoh = {...}',你不能'$ hoh {$ key}',但是如果'$ hoh {$ key}'返回一個hashref,你可以'$ hoh { $ key} {$ subkey}'* AND *'$ hoh {$ key} - > {$ subkey}'具有相同的結果。 – mojo

+2

@mojo:因爲間接箭頭是選項*,只能在關閉/打開花括號對之間選擇*} {'或括號'] ['*。無論如何,否則無法區分作爲'%hoh'元素的'$ hoh {$ key}'和作爲'%$ hoh'元素的'$ hoh - > {$ key}'。 – Borodin