我有各种各样的东西,包括标量和数组.我想复制它,并尝试以下方法:
@b = dclone(\@a)
Run Code Online (Sandbox Code Playgroud)
但是当我尝试从b中读取其中一个标量值时,我什么也得不回来.
但是当我以这种方式复制时,一切似乎都有效:
@b = @{dclone(\@a)}
Run Code Online (Sandbox Code Playgroud)
是什么原因?
Gre*_*con 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";
Run Code Online (Sandbox Code Playgroud)
上面程序的输出是ARRAY,所以要获得深度克隆的数组,请使用
my @copy = @{ dclone \@array };
Run Code Online (Sandbox Code Playgroud)
为了显示在没有取消引用的情况下发生了什么,输出
my @copy = dclone \@array;
for (0 .. 4) {
print "$_: ",
(defined $copy[$_] ? $copy[$_] : "<undef>"),
"\n";
}
Run Code Online (Sandbox Code Playgroud)
是
0: ARRAY(0x1d396c8)
1: <undef>
2: <undef>
3: <undef>
4: <undef>
Run Code Online (Sandbox Code Playgroud)
因此,将结果dclone赋给数组将生成单元素数组,并且尝试获取除零之外的任何值都会产生未定义的值.