Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中,为什么需要@b={dclone(\@a)}?为什么可以';我只是@b=D克隆(\@a)?_Perl_Arrays - Fatal编程技术网

在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 );