$阵列不能打印出任何东西
这是我的计划,我希望让用户通过行中键入一个矩阵行和打印,而矩阵,但我看不到矩阵
用户将键入
1 2 3
4 5 6
7 8 9
这样
,我要让它显示
1 2 3
4 5 6
7 8 9
Perl程序
$Num = 3;
while($Num > 0)
{
$Row = <STDIN>;
$Row = chomp($Row);
@Row_array = split(" ",$Row);
push @P_matrix , @Row_array;
@Row_array =();
$Num = $Num - 1;
}
for($i=0;$i<scalar(@P_matrix);$i++)
{
for($j=0;$j<scalar(@P_matrix[$i]);$j++)
{
printf "$d ",$P_matrix[$i][$j];
}
print "\n";
}
我改变表达式=>printf "$d ",$P_matrix[$i][$j];
打印$P_matrix[$i][$j]
但仍然不能正常工作。
要创建多维数组,您必须使用引用。使用
push @P_matrix, [ @Row_array ];
创建所需的结构。
另外,chomp
不返回修改的字符串。只需使用
chomp $Row;
从$ Row中删除换行符。此外,chomp
根本不需要,如果你split
' '
。
printf
使用%
作为格式化字符,而不是$
。
您可以使用Data::Dumper
来检查复杂的数据结构。使用strict
和warnings
可以帮助您避免常见问题。这是我会怎么写你的程序:
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
my @p_matrix;
push @p_matrix , [ split ' ' ] while <>;
warn Dumper \@p_matrix;
for my $i (0 .. $#p_matrix)
{
for my $j (0 .. $#{ $p_matrix[$i] })
{
printf '%d ', $p_matrix[$i][$j];
}
print "\n";
}
首先请使用use strict; use warnings;
问题在你的代码:
- 你有一个一维数组,但您要访问 它像二维数组。为了使二维阵列将
Row_array
的阵列参考@P_matrix
推送为[@Row_array]
。 -
$d
在哪里定义?如果您的意思是$d
作为标量变量,则声明$d
为my $d
或our $d
。 或 对于使用%d
,使用需要sprintf
。请阅读this。
我有一点困惑,不是%d已经在perl中构建,为什么要将$ d声明为我的$ d? – user2131116 2013-03-04 09:31:15
我的不好。编辑答案。我以为'%d'为'HASH'。 – 2013-03-04 09:43:24
@KrishnachandraSharma你可能是正确的,他正在尝试使用'printf“%d”'。但他没有使用警告,所以他没有对不存在的“$ d”变量发出“未初始化”警告。他也不严格地采取这种措施来防止整个问题。 – TLP 2013-03-04 12:37:31
请问你是否有标量($ p_matrix [$ i])有任何语法问题?当我替换$#{$ p_matrix [$ i]}时,它可以正确运行... 标量($ p_matrix [$ i])的正确语法是什么? – user2131116 2013-03-04 10:41:55
@ user2131116:'$ p_matrix [$ i]'不是一个数组,它是一个数组引用。在使用'scalar':'scalar @ {$ p_matrix [$ i]}''之前,您必须对其进行解引用。无论如何,相比之下,“标量”是不需要的。 – choroba 2013-03-04 10:43:53