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

时间:2010-01-06 16:04:26

标签: perl arrays

我有各种各样的东西,包括标量和数组。我想复制一份,并尝试以下内容:

@b = dclone(\@a)

但是当我尝试从b中读取其中一个标量值时,我什么也得不回来。

当我以这种方式复制时,一切似乎都有效:

@b = @{dclone(\@a)}

是什么原因?

3 个答案:

答案 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( ... )相当于thawfreeze的合成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 );