首先,请在标题和正文中更正我的语言,以便我称之为各种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 ));
有办法做到这一点吗?谢谢!
答案 0 :(得分:3)
虽然使用eval可以做到这一点,但这种方法存在问题。
我怀疑这是您潜在问题的更好答案:
use Data::Diver;
my @datapath = ( 0, 'data', 0, 0 );
print( Dumper( Data::Diver::Dive($decoded_json, @datapath) ));
答案 1 :(得分:2)
这通常不可能,但有一些解决方法:
做一个字符串 - eval
:
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);
当然,这会因为重载对象而失败。