Json 如何将变量作为方法传递给Perl哈希引用?
首先,请在标题和正文中更正我所说的各种Perl语言结构 我无法将变量传递到哈希引用。具体来说,我使用JSON模块解码一些JSON数据,然后访问该数据的特定部分 以下是我的JSON数据示例: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
[
{
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
函数的辱骂是多么有趣。到目前为止,我已经变得“丑陋”、“不高兴”和“有问题”!具有讽刺意味的是,它(似乎)对我的处境很有效。