Perl - 传递参数按值推送函数

时间:2013-02-22 23:01:57

标签: perl

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"},但我找不到,如何通过值传递它。

3 个答案:

答案 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"}));