【问题标题】:How to address specific array element in complex data structure in perl如何在perl中处理复杂数据结构中的特定数组元素
【发布时间】:2019-09-30 09:23:03
【问题描述】:

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

变量

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

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

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

有什么建议吗?

【问题讨论】:

  • 您可以像这样处理数组(元素 0)中的哈希:$data{profiles}{Tags}[0]{"###PLACEHOLDER###"} = "data"
  • 但这是一个数组,值没有排序,所以我不能确保得到正确的。
  • 你能在变量中保存正确的索引(到数组中)吗?
  • 是的,我想是的,我该怎么做?
  • 我建议您为这样一个复杂的嵌套数据结构创建一个面向对象的类,然后提供允许您以适合对象语义的方式添加数据的方法。

标签: perl


【解决方案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###'
        ];

【讨论】:

  • 它在我的机器上运行。它在你的机器上做什么?
  • 对。接得好。对结构的嵌套引用。我会解决的。如果 OP 想要直接更改 ###PLACEHOLDER### 字符串,他们仍然需要对该值的引用。 [现在我明白我做了什么。我在创建帖子时将dpathrdpath 切换为两种情况。糟糕]
【解决方案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,
                },
              ],
}

【讨论】:

    猜你喜欢
    • 2011-06-21
    • 2010-09-27
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多