这个问题可能看似重复,但我对这个概念感到困惑。我搜索了这个,但无法得到答案。所以我最后在论坛上发布了这个
我有一个数据为
的文本文件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 ]
但我需要上面提到的答案来理解这个概念
答案 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;
}