我有以下代码从STDIN读取6x6数组并将其保存为匿名数组的数组。我正在尝试使用$arr[i][j]
打印出每个元素,但下面的代码不起作用。它只是反复打印出第一个元素。我怎么没有正确访问元素?
#!/user/bin/perl
my $arr_i = 0;
my @arr = ();
while ($arr_i < 6){
my $arr_temp = <STDIN>;
my @arr_t = split / /, $arr_temp;
chomp @arr_t;
push @arr,\@arr_t;
$arr_i++;
}
foreach my $i (0..5){
foreach my $j (0..5){
print $arr[i][j] . "\n";
}
}
答案 0 :(得分:4)
i
和j
与您在foreach
行中声明的变量不同。变化:
print $arr[i][j] . "\n";
为:
print $arr[$i][$j] . "\n";
warnings
提醒我这个问题。您应该将这些行添加到所有Perl代码中:
use warnings;
use strict;
答案 1 :(得分:0)
要证明Perlish的咒语是“有多种方法可以做到”:
use 5.10.0; # so can use "say"
use strict;
use warnings qw(all);
sub get_data {
my ($cols, $rows) = @_;
my ($line, @rows);
my $i;
for ($i = 1; $i <= $rows and $line = <DATA>; $i++) {
chomp $line;
my $cells = [ split ' ', $line ];
die "Row $i had ", scalar(@$cells), " instead of $cols" if @$cells != $cols;
push @rows, $cells;
}
die "Not enough rows, got ", $i - 1, "\n" if $i != $rows + 1;
\@rows;
}
sub print_data {
my ($cols, $rows, $data) = @_;
for (my $i = 0; $i < $rows; $i++) {
for (my $j = 0; $j < $cols; $j++) {
say $data->[$i][$j];
}
}
}
my $data = get_data(6, 6);
print_data(6, 6, $data);
__DATA__
1 2 3 4 5 6
a b c d e f
6 5 4 3 2 1
f e d c b a
A B C D E F
7 8 9 10 11 12
说明:
say
,则可以避免不雅观print ..., "\n"
get_data
是一个可以调用和/或重用的函数,而不仅仅是主脚本的一部分get_data
知道它预期的数据形状,如果它没有得到它就会抛出错误[ ... ]
创建一个匿名数组并返回对它的引用get_data
返回数组引用,因此不会复制数据print_data
也是一个功能for
循环而不是制作数字列表,这在Perl 5中需要分配内存还有一个两行版本的程序(带有周围的位和测试数据):
use 5.10.0; # so can use "say"
my @lines = map { [ split ' ', <DATA> ] } (1..6);
map { say join ' ', map qq{"$_"}, @$_ } @lines;
__DATA__
1 2 3 4 5 6
a b c d e f
6 5 4 3 2 1
f e d c b a
A B C D E F
7 8 9 10 11 12
说明:
map
是迭代事物列表的首选方式,您不需要知道已经看过多少事情(否则,需要for
循环)"
只是为了证明它们已被处理。否则第二行可能只是:map { say join ' ', @$_ } @lines;