2013-02-20 127 views
1

我有一個問題,我希望你可以幫忙,因爲我是哈希和哈希引用的新東西嗎?Perl訪問哈希/哈希引用數據結構中的元素

我有以下數據結構:

$VAR1 = { 
    'http://www.superuser.com/' => { 
     'difference' => { 
      'http://www.superuser.com/questions' => '10735', 
      'http://www.superuser.com/faq' => '13095' 
     }, 
     'equal' => { 
      'http://www.superuser.com/ ' => '20892' 
     } 
    }, 
    'http://www.stackoverflow.com/' => { 
     'difference' => { 
      'http://www.stackoverflow.com/faq' => '13015', 
      'http://www.stackoverflow.com/questions' => '10506' 
     }, 
     'equal' => { 
      'http://www.stackoverflow.com/ ' => '33362' 
     } 
    } 

如果我要訪問的所有網址中的關鍵'difference'這樣我就可以再上網址,執行一些其他動作,什麼是正確的或首選方法訪問這些元素?

例如,我將結束與以下網址,我可以再做東西在foreach迴路搭配:

http://www.superuser.com/questions 
http://www.superuser.com/faq 
http://www.stackoverflow.com/faq 
http://www.stackoverflow.com/questions 

------編輯------

代碼訪問上面顯示的數據結構下方的元素:

my @urls; 
foreach my $key1 (keys(%{$VAR1})) { 
    print("$key1\n"); 
    foreach my $key2 (keys(%{$VAR1->{$key1}})) { 
     print("\t$key2\n"); 
    foreach my $key3 (keys(%{$VAR1->{$key1}{$key2}})) { 
     print("\t\t$key3\n"); 
    push @urls, keys %{$VAR1->{$key1}{$key2}{$key3}}; 
    } 
    } 
} 
print "@urls\n"; 

使用上面的代碼爲什麼會出現以下錯誤?

Can't use string ("13238") as a HASH ref while "strict refs" in use at ....

回答

7

它並不難,只是把鑰匙掉在變量每一個關鍵的第二個層次:

my @urls; 
for my $key (keys %$VAR1) { 
    push @urls, keys %{$VAR1->{$key}{'difference'}}; 
} 

如果您與非關聯掙扎,只是要記住,所有值在散列或數組中只能是一個標量值。在多級哈希或數組中,級別只是單個哈希/數組堆疊在一起。

例如,你可以做:

for my $value (values %$VAR1) { 
    push @urls, keys %{$value->{'difference'}}; 
} 

或者

for my $name (keys %$VAR1) { 
    my $site = $VAR1->{$name}; 
    push @urls, keys %{$site->{'difference'}}; 
} 

..taking路線或者直接在所述值(到一個散列的引用)或在臨時變量,代表通過鍵的值。還有更多的閱讀perldoc perldata

+0

非常感謝我正在尋找的東西。如果我只想訪問每個stackoverflow網址末尾的數字,例如'13015','10506'和'33362',代碼會是什麼樣子。我需要學習如何訪問數據結構的不同部分,感謝您的幫助。 – 2013-02-20 13:20:08

+0

你能告訴我代碼會怎麼樣,如果我只想訪問在每個stackoverflow網址結束時的數字,即13015,10506和33362。非常感謝 – 2013-02-20 13:39:34

+1

@ perl-user它簡單。密鑰''http:// www.stackoverflow.com /''的值是一個散列參考。該散列引用中的鍵是「差異」和「等於」,它們的值也是散列引用。這些哈希引用的值是您之後的值。就這樣堆棧'for'循環,你就會好起來的。如果您不確定發生了什麼,請使用'Data :: Dumper'檢查結果。 – TLP 2013-02-20 13:56:15