创建数组数组。我很迷惑

时间:2013-09-19 17:10:52

标签: perl

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

我有一个数据为

的文本文件
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 ]

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

2 个答案:

答案 0 :(得分: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];

答案 1 :(得分: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;
}