1

我正在尝试了解引用在 Perl 中的工作方式,并尝试使用此示例代码:

my @name = ("Jack S", "John L", "Cary S");
my @number = ("29", "78", "54");
my @bigNumber = ("40000", "50000", "60000");

my @array2D = (\@name, \@number, \@bigNumber);

我正在尝试从这个二维数组打印,因此对于数组中的每一行,它最终都会得到与此类似的输出:

杰克小号 29 40000

我似乎无法绕过参考部分。

4

2 回答 2

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

虽然在这一点上,重新考虑你的结构可能会更好。例如,也许您想要按名称索引的数组哈希。

于 2013-11-09T18:49:45.390 回答
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

现在,当您访问数组中的数组 ref 时,您遵循相同的逻辑,尽管它稍微复杂一些

$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]优先级低于印记。所以你需要使用支持花括号

my @foo = @{ $array[0] }

请注意,您用于@访问数组和$访问标量值。

于 2013-11-09T19:10:52.767 回答