per*_*ser 2 perl hash www-mechanize hash-of-hashes hashref
我有一个问题,我希望你可以帮忙,因为我是哈希和哈希参考资料的新手?
我有以下数据结构:
$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'
}
}
Run Code Online (Sandbox Code Playgroud)
如果我想访问密钥中的所有URL,'difference'那么我可以对URL执行一些其他操作,访问这些元素的正确或首选方法是什么?
例如,我最终将得到以下URL,然后我可以在foreach循环中执行以下操作:
http://www.superuser.com/questions
http://www.superuser.com/faq
http://www.stackoverflow.com/faq
http://www.stackoverflow.com/questions
Run Code Online (Sandbox Code Playgroud)
- - - 编辑 - - -
用于访问上面显示的数据结构的元素的代码:
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";
Run Code Online (Sandbox Code Playgroud)
使用上面的代码为什么我会收到以下错误?
Can't use string ("13238") as a HASH ref while "strict refs" in use at ....
这并不困难,只需从变量中的每个键中取出第二级键:
my @urls;
for my $key (keys %$VAR1) {
push @urls, keys %{$VAR1->{$key}{'difference'}};
}
Run Code Online (Sandbox Code Playgroud)
如果您正在努力解除引用,请记住,哈希或数组中的所有值只能是标量值.在多级散列或数组中,级别只是单个散列/数组堆叠在一起.
例如,您可以这样做:
for my $value (values %$VAR1) {
push @urls, keys %{$value->{'difference'}};
}
Run Code Online (Sandbox Code Playgroud)
要么
for my $name (keys %$VAR1) {
my $site = $VAR1->{$name};
push @urls, keys %{$site->{'difference'}};
}
Run Code Online (Sandbox Code Playgroud)
..直接通过值(对哈希的引用)或临时变量,通过键表示值的路径.perldoc perldata还有更多内容可供阅读.