0

这个问题可能看起来像重复,但我对这个概念感到困惑。我搜索了这个,但无法得到答案。所以最后我把这个贴在论坛上

我有一个包含数据的文本文件

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

我想创建数组数组。我为此编写的代码是

#! /usr/bin/perl
#use strict;
#use warnings;

open (FH, "8.txt");
$i = 0;
while (<FH>) {
    @temp = split;
    push @AoA, [ @temp ];
    foreach (@temp) {
        push @{$AoA[$i]}, $_;
    }
    $i++;
}
print $$AoA[0][0];

我没有得到输出。我知道最短的答案是

push @$AoA, [ split ]

但我需要上面提到的答案来理解这个概念

4

2 回答 2

4

这一行:

print $$AoA[0][0];

你说,没有输出。那是因为它引用了变量$AoA。如果您没有禁用use strict; use warnings;它,它将给出以下输出:

Global symbol "$AoA" requires explicit package name at ...
Execution of script.pl aborted due to compilation errors.

也就是说,@AoA$AoA是两个不同的变量,您正在尝试打印一个空元素。您应该从中获取元素的参考@AoA

print $AoA[0][0];
于 2013-09-19T17:29:29.857 回答
2

您要求更长的版本

push @AoA, [ split ];

我假设你的意思是

my @AoA;
while (<>) {
   push @AoA, [ split ];
}

但是,您没有提出任何定义可接受长度的标准。首先,有

my @AoA;
while (<>) {
   push @AoA, [ split ];;
}

我想我们可以扩展[]到它几乎等效:

my @AoA;
while (<>) {
   push @AoA, do { my @anon = ( split ); \@anon };
}

或者如果我们把它分成两行:

my @AoA;
while (<>) {
   my @row = split;
   push @AoA, \@row;
}
于 2013-09-19T17:18:04.817 回答