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

时间:2013-07-08 15:11:17

标签: 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_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 ));

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

2 个答案:

答案 0 :(得分:3)

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

我怀疑这是您潜在问题的更好答案:

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

答案 1 :(得分:2)

这通常不可能,但有一些解决方法:

  1. 做一个字符串 - eval

    my $val = do {
      local $@;
      my $val = eval "\$decoded_json->$datapath";
      die $@ if $@;
      $val;
    };
    

    当然,以这种方式使用eval是不受欢迎的。

  2. 定义一个遍历数据结构的函数:

    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);
    

    当然,这会因为重载对象而失败。