1
push (@{$processor{$-[0]}}, $metadata[$_]{"formatters"});
foreach my $key (keys @{$metadata[$_]{"formatters"}}) {
    $metadata[$_]{"formatters"}[$key]{"scope"} = "end";
}
push (@{$processor{$+[0]}}, $metadata[$_]{"formatters"});

に押し込み$metadata[$_]{"formatters"}ます@{$processor{$-[0]}}。次に、何かを変更してもう一度プッシュする必要がありますが、これらの変更は、最初にプッシュした場所にも反映されます。これを値ではなく参照で渡しているようです$metadata[$_]{"formatters"}が、値で渡す方法がわかりません。

4

3 に答える 3

1

あなたのデザインがとても気になります。みたいな構造

$metadata[$_]{formatters}[$key]{scope}

は複雑で、非常によく似たデータのコピーが複数あるようです。

ただし、問題は、ハッシュの配列への$metadata[$_]{formatters}参照であることですその参照をどこに置いても同じデータを参照するため、それを変更すると、その参照に反映されます。

変更する前に、ハッシュの配列を同一のデータ構造にコピーする必要があります。このコードを使用してそれを行うことができます。配列がまばらな配列 (つまり、すべての要素にデータが含まれているわけではない) であるという疑いがあり、それに応じてコーディングしました。私が間違っていて、すべての要素がハッシュ参照である場合、これを単純化してmy $copy = [ map { {%$_} } @$formatters ].

my $formatters = $metadata[$_]{formatters};

{
  my $copy = [ map $_ ? {%$_} : undef, @$formatters ];
  push @{$processor{$-[0]}}, $copy;

  for my $key (0 .. $#$copy) {
    $copy->[$key]{scope} = 'end';
  }
}

{
  my $copy = [ map $_ ? {%$_} : undef, @$formatters ];
  push @{$processor{$+[0]}}, $copy;
}
于 2013-02-22T23:40:11.327 に答える