我有各种各样的东西,包括标量和数组。我想复制一份,并尝试以下内容:
@b = dclone(\@a)
但是当我尝试从b中读取其中一个标量值时,我什么也得不回来。
当我以这种方式复制时,一切似乎都有效:
@b = @{dclone(\@a)}
是什么原因?
答案 0 :(得分:14)
dclone
获取并返回引用。
#! /usr/bin/perl
use Storable qw/ dclone /;
my @array = ( [1 .. 3], qw/ apple orange banana / );
my $copy = dclone \@array;
print ref($copy), "\n";
上面程序的输出是ARRAY
,因此要获得深度克隆的数组,请使用
my @copy = @{ dclone \@array };
显示没有取消引用的内容,
的输出my @copy = dclone \@array;
for (0 .. 4) {
print "$_: ",
(defined $copy[$_] ? $copy[$_] : "<undef>"),
"\n";
}
是
0: ARRAY(0x1d396c8)
1: <undef>
2: <undef>
3: <undef>
4: <undef>
因此,将dclone
的结果赋给数组将生成单个元素数组,并且尝试获取除零之外的任何值都会产生未定义的值。
答案 1 :(得分:2)
您需要取消引用作为指针(引用)的dclone
的返回值。
答案 2 :(得分:2)
正如一对人所说dclone
接受并返回引用。这已经足够了,但我认为还有为什么?
由于Storable
的文档显示dclone( ... )
相当于thaw
和freeze
的合成thaw( freeze( ... ))
。 thaw
可以解冻任何类型的编码结构。引用可以引用Perl中的任何内容。你想要的数组哈希数组,数组哈希的散列,......它依赖你知道你要求的东西 - 如果不是那样,至少对你而言把它拼凑出来。
但是,如果您真的不喜欢语法,并且将使用ARRAY - &gt; ARRAY成语足以让它看起来更好,你可以像这样写一个包装函数:
sub dclone_array (\@) {
use Storable 'dclone';
my $in = shift;
my $out = dclone( $in );
return @$out;
}
并使用它:
my @copy = dclone_array( @orig );