gpt4 book ai didi

perl - 理解 perl 中的数据结构

转载 作者:行者123 更新时间:2023-12-01 00:07:16 24 4
gpt4 key购买 nike

我正在尝试了解 perldsc 文档中的“常见错误”部分。作者在提到时试图传达什么:

The two most common mistakes made in constructing something like an array of arrays is either accidentally counting the number of elements or else taking a reference to the same memory location repeatedly. Here's the case where you just get the count instead of a nested array:

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

据我了解,当它迭代时,它将采用 (1..10) 的第一个值为 1 并将其传递给这样的函数:

my @array = somefunc(1);

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

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

基本上会这样做:

1 * 1

结果是'1'。

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

@array = ('1');

下一行就可以了:

$AoA[$i] = @array;

我假设 $AoA[$1] 是一个匿名数组(他/她没有用 'my' 声明,顺便说一句),@array 将是作者所说的这个匿名数组的第一个元素错了。并且 for each 循环迭代到“2”。

somefunc(2);

这将是 '4' 并传递给:

$AoA[$i] = @array

这个代码是错误的,作者的意思是什么。我试图理解什么是错的,但更重要的是,我试图理解代码。任何帮助将不胜感激。

更新

我想我明白为什么这是一个常见的错误,因为当我使用 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;
}

在 perldoc perldsc 的常见错误段落中,他/她声明

Here's the case where you just get the count instead of a nested array:

下面是 Dumper 的输出。

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;

所以我假设重复

$VAR1 = 1;

是计数而不是嵌套数组。

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

#!/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;
}

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

更新

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

#!/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);

打印出来的

$VAR1 = [
[
1
],
[
4
],
[
9
],
[
16
],
[
25
],
[
36
],
[
49
],
[
64
],
[
81
],
[
100
]
];

最佳答案

在下面的语句中:

$AoA[$i] = @array;

@array标量上下文 中被引用,产生了许多元素。上下文由 LHS 强加,即 $AoA[$i],它是 @AoA 数组的单个元素。

在 Perl 中,没有严格意义上的数组数组。这些基本上是通过“扁平化”数组或带有引用的数组来模拟的。对于后者,您需要使用引用运算符,如下所示:

$AoA[$i] = \@array;

首先,您可能会发现 Data::Dumper在检查复杂的数据结构(例如 arrayrefs 和 hashrefs)时非常方便。

关于perl - 理解 perl 中的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40453941/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com