Json 如何将变量作为方法传递给Perl哈希引用?

Json 如何将变量作为方法传递给Perl哈希引用?,json,perl,reference,Json,Perl,Reference,首先,请在标题和正文中更正我所说的各种Perl语言结构 我无法将变量传递到哈希引用。具体来说,我使用JSON模块解码一些JSON数据,然后访问该数据的特定部分 以下是我的JSON数据示例: [ { label:"Blah", data:[ [ 2112, 1 ] ] } ] 下面是我的Perl代码: use JSON; use Data::Dumper; my $json = "*JSON data above*"; my $decoded_json = decode

首先,请在标题和正文中更正我所说的各种Perl语言结构

我无法将变量传递到哈希引用。具体来说,我使用JSON模块解码一些JSON数据,然后访问该数据的特定部分

以下是我的JSON数据示例:

[
 {
  label:"Blah",
  data:[
     [ 2112, 1 ]
  ]
 }
]
下面是我的Perl代码:

use JSON;
use Data::Dumper;
my $json = "*JSON data above*";
my $decoded_json = decode_json($json);

# This works, prints out '2112':
print( Dumper( $decoded_json->[0]{'data'}[0][0] ));

# What I'd like to do:
$datapath = "[0]{'data'}[0][0]";
print( Dumper( $decoded_json->$datapath ));

有办法做到这一点吗?谢谢

虽然使用eval可以做到这一点,但这种方法存在一些问题

我认为这是解决您潜在问题的更好答案:

use Data::Diver;
my @datapath = ( 0, 'data', 0, 0 );
print( Dumper( Data::Diver::Dive($decoded_json, @datapath) ));

这通常是不可能的,但有一些变通方法:

  • 执行字符串-
    求值

    my $val = do {
      local $@;
      my $val = eval "\$decoded_json->$datapath";
      die $@ if $@;
      $val;
    };
    
    当然,以这种方式使用
    eval
    是不可取的

  • 定义遍历数据结构的函数:

    sub walk {
      my $data = shift;
      while (@_) {
        my $index = shift;
        if (ref $data eq 'HASH') {
          $data = $data->{$index};
        } elsif (ref $data eq 'ARRAY') {
          $data = $data->[$index];
        } else {
          die qq(Wanted to use index "$index", but "$data" is neither hash nor array);
        }
      }
      return $data;
    }
    
    my $val = walk($decoded_json, 0, 'data', 0, 0);
    
    当然,对于重载对象,这将失败


  • 您可以使用
    eval
    来执行类似的操作,但这将是一件非常丑陋的事情。为什么要将数据的“坐标”编码为字符串?如果它到达一个字符串,你可能会考虑使用ReGEXP来拔出它,特别是如果你需要验证它。数据以JSON格式的字符串(来自web请求)到达。我不需要验证它,我已经知道“坐标”是什么了。然而,我试图概括我的脚本,因为我有不同的
    $datapath
    案例。PS>对
    eval
    函数的辱骂是多么有趣。到目前为止,我已经变得“丑陋”、“不高兴”和“有问题”!具有讽刺意味的是,它(似乎)对我的处境很有效。