我正在尝试理解引用如何在Perl中工作,并且我正在尝试使用此示例代码:
my @name = ("Jack S", "John L", "Cary S");
my @number = ("29", "78", "54");
my @bigNumber = ("40000", "50000", "60000");
my @array2D = (\@name, \@number, \@bigNumber);
我正在尝试从这个2d数组打印,因此最终会为数组中的每一行输出类似于此的输出:
杰克S 29 40000
我似乎无法绕过引用部分。
答案 0 :(得分:6)
帮助理解Perl中深层结构的好方法是使用Data::Dumper。例如:
use strict;
use warnings;
use Data::Dumper;
my @name = ("Jack S", "John L", "Cary S");
my @number = ("29", "78", "54");
my @bigNumber = ("40000", "50000", "60000");
my @array2D = (\@name, \@number, \@bigNumber);
print Dumper \@array2D;
这向我们展示了这个输出:
$VAR1 = [
[
'Jack S',
'John L',
'Cary S'
],
[
'29',
'78',
'54'
],
[
'40000',
'50000',
'60000'
]
];
换句话说,我们传递了Dumper
对包含三个项目的数组的引用,每个项目都是一个数组引用。
因此,如果我们想要遍历这些数组并在每个数组的第一个插槽中打印项目,我们可以这样做:
foreach my $ref( @array2D ) {
print $ref->[0], " ";
}
print "\n";
这会输出:
Jack S 29 40000
如果要概括打印所有记录,可以执行以下操作。 (这假设您的所有嵌套数组都与第一个相同。)
my $count = @{ $array2D[0] };
foreach my $index( 0 .. $count - 1) {
foreach my $ref( @array2D ) {
print $ref->[$index], " ";
}
print "\n";
}
输出:
Jack S 29 40000
John L 78 50000
Cary S 54 60000
虽然在这一点上,重新考虑你的结构可能会更好。例如,您可能需要按名称索引的数组哈希。
答案 1 :(得分:2)
数组元素是标量值。那么
$array[0]
始终是单品。在您的情况下,@array2D
的每个元素都包含一个引用 - 这是一个标量值。内存中的地址。
$array2D[0] # this is \@name, printed it looks like ARRAY(0x328c48)
要访问数组引用中的值,有两种方法。
my $aref = [ 'foo', 'bar', 'baz' ]; # [ .. ] creates an anonymous array ref
print $$aref[0]; # prints "foo"
print $aref->[0]; # same thing
现在,当您访问数组中的数组引用时,您遵循相同的逻辑,尽管它稍微复杂一些
$array[0] # this is an array ref, like $aref above
$array[0]->[0] # using the arrow notation we can access the first element
$array[0][0] # arrows between [], {} are optional, so we can remove it
如果要访问整个数组,可以在引用中应用数组符号,如下所示:
my @foo = @$aref # @foo is now contains a copy of the elements
但是当你有一个多维数组时,你不能只做
@$array[0] # wrong!
因为下标[0]
的优先级低于sigil。所以你需要使用支撑花括号
my @foo = @{ $array[0] }
请注意,您使用@
来访问数组,使用$
来访问标量值。