向Perl / JSON对象添加多个值

huangapple go评论65阅读模式
英文:

Add multiple values to Perl / JSON object

问题

以下是您要翻译的内容:

"I'm sure there is a 'shortcut' to this problem - which I thought I'd solved, but which now doesn't work. Suggestions please.

Having decoded the JSON object to "$codes," this works:

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

but it is somewhat repetitive to add 10 entries in this way. I'm SURE I found a solution on SO - which I now can't find. In my script, it is:

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

But I get "Can't modify constant item in scalar assignment ..." I have also tried removing the quotes, and using "fat arrows" on the entries to add, but that doesn't help. Probably a "schoolboy error," but where am I going wrong?

(As I operate between "PHP" and "Perl," perhaps this structure only works in PHP)

Also, I need to add another object to the entry, so tried "affs"={} and "affs:"={} within the brackets ... but that created an error too. I could use the "long" line shown above, but be helpful to do it all in one operation. Here is the required existing structure:

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

I'm sure there is a "shortcut" to this problem - which I thought I'd solved, but which now doesn't work. Suggestions please.

Having decoded the JSON object to "$codes", this works:

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

but it is somewhat repetative to add 10 entries in this way. I'm SURE I found a solution on SO - which I now can't find. In my script, it is:

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

But I get "Can't modify constant item in scalar assignment ..." I have also tried removing the quotes, and using "fat arrows" on the entries to add, but that doesn't help. Probably a "schoolboy error", but where am I going wrong?

(As I operate between "PHP" and "Perl", perhaps this structure only works in PHP)

Also, I need to add another object to the entry, so tried "affs"={} and "affs:"={} within the brackets ... but that created an error too. I could use the "long" line shown above, but be helpful to do it all in one operation. Here is the required existing structure:

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

答案1

得分: 3

以下是翻译好的代码部分:

创建新的哈希/对象您可以使用以下方法

$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,
   {},
);
不太好

如何合并哈希

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,可能不可用。

英文:

To create a new hash/object, you could use the following:

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

To add to an existing hash/object (creating it if it doesn't exist) without clobbering any other existing fields, you could use the following:

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

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

We could try other things, like a hash slice.

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

Not great.

How about merging hashes?

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

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

More expensive, and still not really any better than the solution with which we started.

Finally, how about a multi-variable foreach loop?

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

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

This is clean, but it's hard to see an advantage (with a fixed number of assignments). And it requires 5.36 which may not be available.

答案2

得分: 0

"See, I told ya it was 'schoolboy'. The line:

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

Should have been:

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

(The last short arrow (->) before the curly bracket should have been an equal sign!! Only taken me three hours to spot that typo !!)"

英文:

See, I told ya it was "schoolboy". The line:

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

Should have been:

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

(The last short arrow (->) before the curly bracket should have been an equal sign!! Only taken me three hours to spot that typo !!)

huangapple
  • 本文由 发表于 2023年6月12日 18:30:03
  • 转载请务必保留本文链接:https://go.coder-hub.com/76455756.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定