在Perl中,为什么我需要@b = @ {dclone(\ @ a)}?为什么我不能只是@b = dclone(\ @ a)?

shi*_*ino 4 arrays perl

我有各种各样的东西,包括标量和数组.我想复制它,并尝试以下方法:

@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赋给数组将生成单元素数组,并且尝试获取除零之外的任何值都会产生未定义的值.