我有一些Perl代码:
{
key => [@{$myArray}]
}
我想重构一下:
{
key => $myArray
}
如果我没有改变key
指向的值,两者在语义上是否相等?
答案 0 :(得分:6)
时,他们的行为有所不同
@{ $h->{key} }
已更改。 (你提到的差异)
@$array
已更改。
$array
不能作为数组解除引用(例如$array
是字符串)。
$array
是一个重载@{}
的对象。
@$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
的值。如果你绝对不希望原来的任何未来的变化发生变异,那么你提出的重构可能是有害的。