如果我没有改变值,那么[@ {$ myArray}]是否相当于Perl中的$ myArray?

时间:2015-02-17 22:18:10

标签: perl

我有一些Perl代码:

{
  key => [@{$myArray}]
}

我想重构一下:

{
  key => $myArray
}

如果我没有改变key指向的值,两者在语义上是否相等?

3 个答案:

答案 0 :(得分:6)

时,他们的行为有所不同
  1. @{ $h->{key} }已更改。 (你提到的差异)

  2. @$array已更改。

  3. $array不能作为数组解除引用(例如$array是字符串)。

  4. $array是一个重载@{}的对象。

  5. @$array的元素很大或很神奇。

    第一个片段在创建哈希时创建元素的副本,因此它会更慢,并且它将使用更多内存。数组或元素的任何神奇方面(例如,如果数组是:shared数组,或者数组绑定到Tie::File)都不会被第二个代码段复制。

答案 1 :(得分:4)

不,他们不是。即使$data->{key}引用的数组永远不会改变。

$myArray是对数组的引用。 [@{$myArray}]复制$ myArray引用的数组,然后引用它。复制数组可以双向工作。它屏蔽了$myArray$data所做更改的屏蔽,但也屏蔽$data $myArray中的更改。 即使你没有变异$data->{key},他们仍然有语义差异。例如......

my $myArray = ["a", "b", "c"];
$data->{key1} = $myArray;
$data->{key2} = [@{$myArray}];
$myArray->[1] = "q";

print $data->{key1}[1];  # q
print $data->{key2}[1];  # b

除非您完全控制$myArray$data,否则重构是不安全的。

答案 2 :(得分:2)

它将为具有相同内容的数组创建不同的引用。在数组永远不会更改的情况下,这在功能上是等效的,但如果有人稍后出现并执行类似的操作:

push @{ $p->{key} }, "foo";

然后在前一种情况下,它会保持$myArray不受影响。在后者中,它将改变其他地方使用$myArray的值。如果你绝对不希望原来的任何未来的变化发生变异,那么你提出的重构可能是有害的。