我在perl中有一个复杂的json数据结构,如以下示例所示。我想处理数组元素并存储数据。
变量
$VAR1 = {
'dummy' => 'foo',
'profiles' => {
'Tags' => [
{
'###PLACEHOLDER###',
}
],
}
例如,我可以在“ ### PLACEHOLDER ###”处添加元素,但稍后希望在perl脚本中在该占位符下面添加其他信息。 通常,我会使用$ var-> {profiles}-> {Tags}-> {PLACEHOLDER}处理这些元素,但这不适用于数组。
当我确切知道名字时,我不想每次都创建一个foreach循环。
有什么建议吗?
答案 0 :(得分: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,
},
],
}
答案 1 :(得分: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###'
];