在Perl中,为什么需要@b={dclone(\@a)}?为什么可以';我只是@b=D克隆(\@a)?
我有各种各样的东西,包括标量和数组。我想复制它,并尝试了以下操作:在Perl中,为什么需要@b={dclone(\@a)}?为什么可以';我只是@b=D克隆(\@a)?,perl,arrays,Perl,Arrays,我有各种各样的东西,包括标量和数组。我想复制它,并尝试了以下操作: @b = dclone(\@a) 但当我试图从b中读取一个标量值时,我什么也没得到 当我以这种方式复制时,一切似乎都正常,不过: @b = @{dclone(\@a)} 原因是什么?获取并返回引用 #! /usr/bin/perl use Storable qw/ dclone /; my @array = ( [1 .. 3], qw/ apple orange banana / ); my $copy = dclon
@b = dclone(\@a)
但当我试图从b中读取一个标量值时,我什么也没得到
当我以这种方式复制时,一切似乎都正常,不过:
@b = @{dclone(\@a)}
原因是什么?获取并返回引用
#! /usr/bin/perl
use Storable qw/ dclone /;
my @array = ( [1 .. 3], qw/ apple orange banana / );
my $copy = dclone \@array;
print ref($copy), "\n";
上面程序的输出是数组
,因此要获得深度克隆的数组,请使用
my @copy = @{ dclone \@array };
为了显示在没有取消引用的情况下发生了什么
my @copy = dclone \@array;
for (0 .. 4) {
print "$_: ",
(defined $copy[$_] ? $copy[$_] : "<undef>"),
"\n";
}
my@copy=dclone\@数组;
对于(0..4){
打印“$”,
(定义为$copy[$\u]?$copy[$\u]:“”),
“\n”;
}
是
0:数组(0x1d396c8)
1:
2:
三:
4:
因此,将
dclone
的结果赋给一个数组将产生一个单元素数组,尝试获取除第零个以外的任何值都会产生未定义的值。您需要取消引用dclone
的返回值,它是一个指针(参考).正如一对夫妇所说的那样,dclone
获取并返回引用。这很好,但我认为还有一个问题,为什么
如文档所示,dclone(…)
相当于saw
和freeze
作为saw(freeze(…)
的组合<代码>解冻可以解冻任何类型的编码结构。引用可以引用Perl中的任何内容。你想要的数组的散列,数组的散列。。。。它依赖于你知道你要的是什么——如果不是这样的话,至少你要把它弄清楚一点
但是,如果您确实不喜欢该语法,并且将充分使用ARRAY->ARRAY习惯用法以使其看起来更好,则可以编写如下包装函数:
sub dclone_array (\@) {
use Storable 'dclone';
my $in = shift;
my $out = dclone( $in );
return @$out;
}
然后像这样使用它:
my @copy = dclone_array( @orig );
my @copy = dclone_array( @orig );