2013-02-20 91 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