【问题标题】:Perl: array reference versus anonymous arrayPerl:数组引用与匿名数组
【发布时间】:2012-05-10 17:35:34
【问题描述】:

这可能是个傻问题……下面的代码分别输出@arrayref@arraycont的内容。请注意它们之间的区别以及它们的值分配方式。我知道匿名数组的作用,但是任何人都可以解释为什么会有区别吗?

非常感谢。

@arrayref = ();
@array = qw(1 2 3 4);
$arrayref[0] = \@array;
@array = qw(5 6 7 8);
$arrayref[1] = \@array;
print join "\t", @{$arrayref[0]}, "\n";
print join "\t", @{$arrayref[1]}, "\n";

@arraycont = ();
@array = qw(1 2 3 4);
$arraycont[0] = [@array];
@array = qw(5 6 7 8);
$arraycont[1] = [@array];
print join "\t", @{$arraycont[0]}, "\n";
print join "\t", @{$arraycont[1]}, "\n";

输出

5   6   7   8   
5   6   7   8   
1   2   3   4   
5   6   7   8   

【问题讨论】:

    标签: arrays perl


    【解决方案1】:

    这会创建数组的浅层副本:

    $arraycont[0] = [@array];

    而这只是创建对它的引用:

    $arrayref[0] = \@array;

    因为你后来修改了数组:

    @array = qw(5 6 7 8);

    arrayref 仍然指向内存中的相同数组位置,因此当在打印语句中取消引用时,它会打印当前数组值5 6 7 8

    【讨论】:

    • 一个 shallow 副本,如果 @array 包含引用,那么 [@array] 将包含这些相同的引用。在这种情况下,深/浅的区别并不适用,但我认为无论如何都值得一提。
    【解决方案2】:

    第一个块存储@array的地址。参考就像'直播',你得到当前状态。 因此,如果您创建对 @array 的引用,例如 \@array,,当您取消引用它时,您将始终获得取消引用时 @array 的点. 当你取消引用 @array 时,(5 6 7 8)

    当您执行 [@array] 时,就像将 实时流媒体 录制到您的磁盘中一样。因此,当您(重新)播放录制的内容时,您会得到 在录制时流式传输。因此,当您引用 $arraycont[0] 时,您会得到 @array 在复制时所拥有的内容,即
    (1 2 3 4)

    【讨论】:

      【解决方案3】:

      您对$arrayref[0]$arrayref[1] 中的单个数组进行了存储引用。你 应该使用不同的数组。

      my @refs;
      
      my @array1 = qw(1 2 3 4);
      push @refs, \@array1;
      
      my @array2 = qw(5 6 7 8);
      push @refs, \@array2;
      

      实际上,my 在循环的每一轮中执行,每次都会创建一个新数组。

      my @refs;
      while ( my @row = get() ) {
         push @refs, \@row;
      }
      

      在您必须克隆数组的极少数情况下,您可以使用:

      use Storable qw( dclone );
      
      push @refs, [ @row ];       # Shallow clone
      push @refs, dclone(\@row);  # Deep clone
      

      【讨论】:

        猜你喜欢
        • 2014-03-16
        • 2011-04-24
        • 1970-01-01
        • 1970-01-01
        • 2016-03-16
        • 2016-02-25
        • 1970-01-01
        • 2012-06-15
        • 2014-04-19
        相关资源
        最近更新 更多