我有一个用Data::Dumper打印的对象:
$VAR1 = {
'record' => [
{
'text' => 'booting kernel',
'version' => '2',
'iso8601' => '2011-06-23 11:57:14.250 +02:00',
'event' => 'system booted',
'modifier' => 'na'
},
{
'text' => 'successful login',
'subject' => {
'sid' => '999',
'uid' => 'user',
'audit-uid' => 'user',
'tid' => '0 0 unknown',
'ruid' => 'user',
'rgid' => 'gsp',
'pid' => '999',
'gid' => 'gsp'
},
'version' => '2',
'iso8601' => '2011-06-23 11:58:00.151 +02:00',
'event' => 'login - local',
'return' => {
'retval' => '0',
'errval' => 'success'
},
'host' => 'unknown'
},
],
'file' => {
'iso8601' => '2011-06-23 11:57:40.064 +02:00'
}
};
我想打印导航这种哈希值的每个值。我理解的是一个哈希,它有两个键(记录,文件)和一个哈希数组的记录点。
你能帮助达到这个结构的每个价值吗?
我试过了:
my @array=$VAR1{'record'};
foreach (@array) {
print $_{'text'};
}
......但它不起作用。
答案 0 :(得分:3)
如果你只是想迭代它,你可以这样做:
iterate($VAR1);
sub iterate {
my $input = shift;
unless (ref $input) {
print "$input\n";
} elsif (ref $input eq 'ARRAY') {
iterate($_) for @$input;
} elsif (ref $input eq 'HASH') {
for (keys %$input) {
print "$_\n";
iterate($input->{$_});
}
} else {
print ref $input,"\n";
}
}
这并不像Data :: Dumper那样完全打印出来,但是如果你想用你不太了解的任意嵌套结构做任何其他事情,这项技术可能会很有用。
答案 1 :(得分:1)
$VAR1{record}
是数组引用,而不是数组。要访问数组,您需要取消引用:
my @array = @{ $VAR1->{record} };
数组中的每个元素都是一个哈希引用,所以:
for my $record ( @array ) {
print $record->{text};
}
答案 2 :(得分:0)
$VAR1
是一个参考。你需要取消引用它。
$VAR1->{record}
是一个参考。你也需要取消引用它。
$_
也是一个引用,因此您需要取消引用它。
my @array = @{ $VAR1->{'record'} };
foreach (@array) {
print $_->{'text'};
}
答案 3 :(得分:0)
尝试:
foreach my $record_ref ( @{ $VAR1->{record} } ) {
print "$record_ref->{text}\n";
}
这里,这些变量被解除引用:
$VAR1 - hash ref,
$VAR1->{record} - array ref,
$record_ref - hash ref.
将此添加到您的代码中以捕获明显的引用错误:
use warnings;
use strict;
对于要检查的任何变量(例如,$ record_ref),使用带Data :: Dumper的打印进行诊断。