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"}
,但我找不到,如何通过值传递它。
答案 0 :(得分:4)
由于$metadata[$_]{'formatters'}
本身就是一个复杂的数据结构,因此它本身没有“值”。不过,你可以推送它的副本。
只做一个浅拷贝(可能不是你想要的,因为新数组仍然会引用所有相同的哈希):
$orig = $metadata[$_]{'formatters'};
$copy = [ @$orig ];
还要复制每个引用的哈希:
$orig = $metadata[$_]{'formatters'};
$copy = [ map +{%$_}, @$orig ];
或者只是复制任意数据结构:
$copy = Storable::dclone($orig);
(CPAN上有各种克隆模块也可以这样做。)
答案 1 :(得分: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;
}
答案 2 :(得分:-1)
此代码甚至不会编译。 您在@ {$ metadata [$ _] {“formatters”}}上拨打密钥 这不是哈希,它是一个数组。
问题是形成不良。
这段代码令人难以置信,难以理解。 我强烈建议使用 - >嵌套时的表示法 这样的结构可以清楚地表明您正在使用引用 到子结构。
要深度复制结构,以便最终不会获得结果
对子组件的引用,我建议克隆。例如。:
use Clone qw(clone);
push (@{$processor{$-[0]}}, clone($metadata[$_]{"formatters"}));