向Perl / JSON对象添加多个值

nxagd54h  于 2023-06-23  发布在  Perl
关注(0)|答案(2)|浏览(149)

我相信这个问题有一个“捷径”--我以为我已经解决了,但现在行不通了。请提出建议。
在将JSON对象解码为“$codes”之后,这就可以了:

$codes->{"product"}->{"ad_id"}->{"$ad_id"}->{"singlePay"}=$singlePayments;
$codes->{"product"}->{"ad_id"}->{"$ad_id"}->{"trialPay"}=$trialPayments;
$codes->{"product"}->{"ad_id"}->{"$ad_id"}->{"subsPay"}=$subsPayments;

但是以这种方式添加10个条目有些重复。我确信我找到了一个解决方案-我现在找不到。在我的脚本中,它是:

$codes->{"product"}->{"ad_id"}->{"$ad_id"}->{
"singlePay"=$singlePayments,
"trialPay"=$trialPayments,
"subsPay"=$subsPayments
};

但是我得到了“不能修改标量赋值中的常量项……”我也试过删除引号,并在条目上使用“胖箭头”来添加,但这没有帮助。可能是一个“小学生错误”,但我哪里错了?
(As我在“PHP”和“Perl”之间操作,也许这种结构只在PHP中起作用)
另外,我需要在条目中添加另一个对象,因此尝试了括号中的"affs"={}"affs:"={}...但这也造成了错误。我可以使用上面显示的“长”行,但在一个操作中完成所有操作会有所帮助。以下是所需的现有结构:

"codes":{
     "product":{
          "ad_id":{
               "itemNo1":{
                    singlePay":"0.00",
                    "trialPay":"0.00",
                    "subsPay":"0.00",
                    "affs":{}
                }
          }
     }
}
bfnvny8b

bfnvny8b1#

要创建一个新的hash/object,可以使用以下方法:

$codes->{ product }{ ad_id }{ $ad_id } = {
   singlePay => $singlePayments,
   trialPay  => $trialPayments,
   subsPay   => $subsPayments,
   affs      => { },
};

要添加到现有的散列/对象(如果它不存在,则创建它)而不删除任何其他现有字段,您可以使用以下命令:

my $dst = $codes->{ product }{ ad_id }{ $ad_id } //= { };

$dst->{ singlePay } = $singlePayments;
$dst->{ trialPay  } = $trialPayments;
$dst->{ subsPay   } = $subsPayments;
$dst->{ affs      } = { };

我们可以试试其他的东西,比如哈希片。

$codes->{ product }{ ad_id }{ $ad_id }->@{qw(
   singlePay
   trialPay
   subsPay
   affs
)} = (
   $singlePayments,
   $trialPayments,
   $subsPayments,
   { },
);

不太好
合并hash怎么样?

my $dst = $codes->{ product }{ ad_id }{ $ad_id } //= { };

%$dst = ( %$dst,
   singlePay => $singlePayments,
   trialPay  => $trialPayments,
   subsPay   => $subsPayments,
   affs      => { },
);

更昂贵,但仍然没有比我们开始的解决方案更好。
最后,多变量foreach循环如何?

my $dst = $codes->{ product }{ ad_id }{ $ad_id } //= { };

for my ( $k, $v ) (  # 5.36+
   singlePay => $singlePayments,
   trialPay  => $trialPayments,
   subsPay   => $subsPayments,
   affs      => { },
) {
   $dst->{ $k } = $v;
}

这是干净的,但很难看到优势(有固定数量的分配)。它需要5.36,可能没有。

9rbhqvlz

9rbhqvlz2#

看,我就说是“学生”。线路:

$codes->{"product"}->{"ad_id"}->{"$ad_id"}->{

应该是:

$codes->{"product"}->{"ad_id"}->{"$ad_id"}={

(The花括号前的最后一个短箭头(->)应该是等号!我只花了三个小时就发现了那个错字!!)

相关问题