了解perl中的数据结构

Bio*_*Rod 3 perl

我正在尝试理解perldsc文档中的"常见错误"部分.当他提到时,作者试图传达的是什么:

构造像数组数组之类的两个最常见的错误是意外地计算元素的数量,或者重复引用相同的内存位置.在这种情况下,您只需获取计数而不是嵌套数组:

for my $i (1..10) {
    my @array = somefunc($i);
    $AoA[$i] = @array;      # WRONG!
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,当它迭代时,它将取第一个值(1..10),即1,并将它传递给这样的函数:

my @array = somefunc(1);
Run Code Online (Sandbox Code Playgroud)

由于没有定义该函数,我将创建逻辑.

sub somefunc  {
my $a = shift;
print $a * $a;
}
Run Code Online (Sandbox Code Playgroud)

这基本上会这样做:

1 * 1
Run Code Online (Sandbox Code Playgroud)

结果是'1'.

根据我的理解,我的@array看起来像:

@array = ('1');
Run Code Online (Sandbox Code Playgroud)

下一行将做:

$AoA[$i] = @array;
Run Code Online (Sandbox Code Playgroud)

我假设$ AoA [$ 1]是一个匿名数组(他/她没有用'my',btw声明)而@array将是这个匿名数组的第一个元素,作者说它'错了.并为每个循环迭代到'2'.

somefunc(2);
Run Code Online (Sandbox Code Playgroud)

这将是'4'并传递给:

$AoA[$i] = @array
Run Code Online (Sandbox Code Playgroud)

使用此代码的作者有什么意义呢?我试图理解错误,但更重要的是,我正在努力理解代码.任何帮助将不胜感激.

UPDATE

我想我明白为什么这是一个常见的错误,因为当我使用print和Dumper时,我可以直观地看到作者试图传达的内容,这里是修改后的代码.

#!/usr/bin/perl -w
use strict;
use Data::Dumper;

for my $i (1..10) {
           my @AoA;
           my @array = somefunc($i);
           print "The array is Dumper(@array)\n";
           $AoA[$i] = @array;      # WRONG!
           print Dumper($AoA[$i]);
       }


sub somefunc  {
my $a = shift;
return $a * $a;
}
Run Code Online (Sandbox Code Playgroud)

他/她表示,在perldoc perldsc的常见错误段落中

在这种情况下,您只需获取计数而不是嵌套数组:

以下是翻斗车的输出.

The array is Dumper(1)
$VAR1 = 1;
The array is Dumper(4)
$VAR1 = 1;
The array is Dumper(9)
$VAR1 = 1;
The array is Dumper(16)
$VAR1 = 1;
The array is Dumper(25)
$VAR1 = 1;
The array is Dumper(36)
$VAR1 = 1;
The array is Dumper(49)
$VAR1 = 1;
The array is Dumper(64)
$VAR1 = 1;
The array is Dumper(81)
$VAR1 = 1;
The array is Dumper(100)
$VAR1 = 1;
Run Code Online (Sandbox Code Playgroud)

所以我假设重复了

$VAR1 = 1;
Run Code Online (Sandbox Code Playgroud)

是计数而不是嵌套数组.

作者确实指出,如果计数是我真正想要的,那么就像这样重写代码:

#!/usr/bin/perl -w
use strict;
use Data::Dumper;

for my $i (1..10) {
           my @count;
           my @array = somefunc($i);
           print "The array is Dumper(@array)\n";
           $count[$i] = scalar @array;      
           print Dumper($count[$i]);
       }


sub somefunc  {
my $a = shift;
return $a * $a;
}
Run Code Online (Sandbox Code Playgroud)

但文档没有告诉我如何获得嵌套数组?

UPDATE

如果我错了,请纠正我,但我重写代码以获取嵌套数组:

#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my @count;
my @new_array;

for my $i (1..10) {
           #my @count;
           my @array = somefunc($i);
           push @new_array, [@array];
       }


sub somefunc  {
my $a = shift;
return $a * $a;
}

print Dumper(\@new_array);
Run Code Online (Sandbox Code Playgroud)

哪个印刷

$VAR1 = [
      [
        1
      ],
      [
        4
      ],
      [
        9
      ],
      [
        16
      ],
      [
        25
      ],
      [
        36
      ],
      [
        49
      ],
      [
        64
      ],
      [
        81
      ],
      [
        100
      ]
    ];
Run Code Online (Sandbox Code Playgroud)

Grz*_*ski 6

在以下声明中:

$AoA[$i] = @array;
Run Code Online (Sandbox Code Playgroud)

@array被引用的标量环境,产生了许多其元件.LHS强加了上下文,它是数组$AoA[$i]的单个元素@AoA.

在Perl中,严格意义上没有数组数组.它们基本上由"扁平"数组或带引用的数组模拟.对于后者,您需要使用take reference运算符,如:

$AoA[$i] = \@array;
Run Code Online (Sandbox Code Playgroud)

对于入门者,您可能会发现,Data::Dumper在检查复杂数据结构(例如arrayrefs和hashrefs)时非常方便.