$阵列不能打印出任何东西

$阵列不能打印出任何东西

问题描述:

这是我的计划,我希望让用户通过行中键入一个矩阵行和打印,而矩阵,但我看不到矩阵

用户将键入

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来检查复杂的数据结构。使用strictwarnings可以帮助您避免常见问题。这是我会怎么写你的程序:

#!/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"; 
    } 
+0

请问你是否有标量($ p_matrix [$ i])有任何语法问题?当我替换$#{$ p_matrix [$ i]}时,它可以正确运行... 标量($ p_matrix [$ i])的正确语法是什么? – user2131116 2013-03-04 10:41:55

+0

@ user2131116:'$ p_matrix [$ i]'不是一个数组,它是一个数组引用。在使用'scalar':'scalar @ {$ p_matrix [$ i]}''之前,您必须对其进行解引用。无论如何,相比之下,“标量”是不需要的。 – choroba 2013-03-04 10:43:53

首先请使用use strict; use warnings;

问题在你的代码:

  1. 你有一个一维数组,但您要访问 它像二维数组。为了使二维阵列将Row_array的阵列参考@P_matrix推送为[@Row_array]
  2. $d在哪里定义?如果您的意思是$d作为标量变量,则声明$dmy $dour $d 对于使用%d,使用需要sprintf。请阅读this
+1

我有一点困惑,不是%d已经在perl中构建,为什么要将$ d声明为我的$ d? – user2131116 2013-03-04 09:31:15

+0

我的不好。编辑答案。我以为'%d'为'HASH'。 – 2013-03-04 09:43:24

+0

@KrishnachandraSharma你可能是正确的,他正在尝试使用'printf“%d”'。但他没有使用警告,所以他没有对不存在的“$ d”变量发出“未初始化”警告。他也不严格地采取这种措施来防止整个问题。 – TLP 2013-03-04 12:37:31