如何在Perl中解决复杂数据结构中的特定数组元素

时间:2019-05-13 12:03:49

标签: perl

我在perl中有一个复杂的json数据结构,如以下示例所示。我想处理数组元素并存储数据。

变量

$VAR1 = {
  'dummy' => 'foo',
  'profiles' => {
    'Tags' => [
                {
                  '###PLACEHOLDER###',
                }
              ],
}

例如,我可以在“ ### PLACEHOLDER ###”处添加元素,但稍后希望在perl脚本中在该占位符下面添加其他信息。 通常,我会使用$ var-> {profiles}-> {Tags}-> {PLACEHOLDER}处理这些元素,但这不适用于数组。

当我确切知道名字时,我不想每次都创建一个foreach循环。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

我不清楚您“在###PLACEHOLDER###处添加元素”的含义。可以将元素添加到数组和哈希中,尚不清楚您要引用哪个数组或哈希。


要将元素附加到$var->{profiles}{Tags}引用的数组中,请使用

push @{ $var->{profiles}{Tags} }, $val;

这导致

$VAR1 = {
  'dummy' => 'foo',
  'profiles' => {
    'Tags' => [
                {
                  '###PLACEHOLDER###' => undef,
                },
                $val
              ],
}

要将元素添加到$var->{profiles}{Tags}所引用数组的最后一个元素所引用的哈希中,请使用

$var->{profiles}{Tags}[-1]{$key} = $val;

这导致

$VAR1 = {
  'dummy' => 'foo',
  'profiles' => {
    'Tags' => [
                {
                  '###PLACEHOLDER###' => undef,
                  $key => $val,
                },
              ],
}

当然,如果$key###PLACEHOLDER###,则结果为

$VAR1 = {
  'dummy' => 'foo',
  'profiles' => {
    'Tags' => [
                {
                  '###PLACEHOLDER###' => $val,
                },
              ],
}

答案 1 :(得分:1)

[更新:使用dpathr代替dpath来引用结构)

[更新:使用dpath代替dpathr来引用元素]

Data::DPath可以满足您的要求。下面的代码返回对包含其值为###PLACEHOLDER###的元素的任何结构(哈希或数组)的引用:

use strict;
use warnings;

use Data::Dumper;
use Data::DPath qw[ dpath dpathr ];

my $struct = {
    'dummy'    => 'foo',
    'profiles' => {
        'ARRAY' => [ '###PLACEHOLDER###' ],
        'HASH' => { key => '###PLACEHOLDER###' },
    },
};

my $path = dpath( '//[value eq "###PLACEHOLDER###"]/..' );

my @matches = $path->match( $struct );

print Dumper \@matches;

结果为:

$VAR1 = [
          [
            '###PLACEHOLDER###'
          ],
          {
            'key' => '###PLACEHOLDER###'
          }
        ];

如果要直接访问该元素,请将路径更改为

my $path = dpathr( '//*[value eq "###PLACEHOLDER###"]' );

结果:

$VAR1 = [
          \'###PLACEHOLDER###',
          \'###PLACEHOLDER###'
        ];