我在perl中读取json文件并且无法使用结果。
我想知道json文件中有多少视图。 应该有2个
my $data = decode_json($json);
print Dumper($data);
my @tmp=$data->{'views'};
my $nviews=scalar @tmp;
print "nviews : $nviews\n";
给了我
$VAR1 = {
'views' => [
{
'key' => 0,
'value' => {
'ptr_wrapper' => {
'data' => {
'width' => 776,
'height' => 1024,
'id_view' => 0,
'filename' => '000118800_15821618907.jpg',
'id_pose' => 0,
'id_intrinsic' => 13,
'local_path' => '/'
},
'id' => 2147483649
}
}
},
{
'key' => 1,
'value' => {
'ptr_wrapper' => {
'data' => {
'id_pose' => 1,
'id_intrinsic' => 11,
'filename' => '000132800_22050281512.jpg',
'id_view' => 1,
'local_path' => '/',
'width' => 850,
'height' => 1024
},
'id' => 2147483650
}
}
}
]
};
nviews : 1
提前感谢任何帮助.luc
答案 0 :(得分:4)
当你写这个
my $data = decode_json($json);
my @tmp = $data->{'views'};
您正在创建一个Perl数组,其中包含与<{1}} 相同的单个元素$tmp[0]
。
您的$data->{'views'}
已开启,因此您已正确理解如何访问$data->{'views'}
变量引用的哈希的views
元素,并且只要哈希密钥{ {1}}看起来像Perl标识符,你可以忘记它周围的引号
但是Perl哈希值和数组的值总是标量,因此如果需要访问数组,则必须取消引用它们,这同样适用于您需要访问的任何子结构
如果您正在处理复杂的数据结构,通常最好保留一个临时标量变量来跟踪您在结构中的位置。例如,我会写
$data
现在我有一个简单的数组引用来编码。我可以将其取消引用到views
的数组,我可以使用my $views = $data->{views};
等访问其元素。
这是我自己的代码的重写,它完成了我所描述的内容。我还使用Data::Dump
重新格式化您显示的数据。它通常比@$views
的输出更简洁和可读,但它不是核心模块,因此您可能需要安装它
我将$views->[0]
作为词汇变量Data::Dumper
,然后将$value->{ptr_wrapper}
作为词汇变量$wrapper
。其余的代码变得如此简单,因为我可以编写像
$wrapper->{data}
$data
say $data->{views}[0]{value}{ptr_wrapper}{data}{filename}
答案 1 :(得分:3)
my $views = $data->{views};
my $nbViews = scalar @$views;
$data->{views}
是对数组的引用,而不是数组。存储引用,并在需要时取消引用它。
可替换地:
my @views = @{$data->{views}};
my $nbViews = scalar @views;
正如Borodin所指出的那样,请注意,此替代方案会对原始数组进行复制(可能使用大量内存)。在某些情况下,这可能是你真正想要做的事情(如果你需要修改它,同时保持原始的完整,但请注意这不是一个深层复制),但最常见的(特别是如果你只想计算项目或者迭代它们,你可能不想这样做,只是坚持保持引用(如上面的第一个代码片段)。