perl + json获取数组的大小

时间:2016-01-26 18:42:50

标签: json perl

我在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

2 个答案:

答案 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所指出的那样,请注意,此替代方案会对原始数组进行复制(可能使用大量内存)。在某些情况下,这可能是你真正想要做的事情(如果你需要修改它,同时保持原始的完整,但请注意这不是一个深层复制),但最常见的(特别是如果你只想计算项目或者迭代它们,你可能不想这样做,只是坚持保持引用(如上面的第一个代码片段)。