2013-03-27 67 views
1

我已经浏览了网站上的多个主题,包括这个主题,试图理解为什么我在使用我的$行时收到未声明的变量错误。 @lines数组的每个元素都是一个字符串数组。2d arr explicitpackage

的错误是在第25行和27与$线[$ count]个说法

use strict; 
use warnings; 

my @lines; 
my @sizes; 

# read input from stdin file into 2d array 
while(<>) 
{ 
    push(@lines, my @tokens = split(/\s+/, $_)); 
} 

# search through each array for largest sizes in 
# corresponding elements 
for (my $count = 0; $count <= 5; $count++) 
{ 
    push(@sizes, 0); 
    foreach my $line (@lines) 
    { 
     if(length($line[$count])>$sizes[$count]) 
     { 
      $sizes[$count] = length($line[$count]); 
     } 
    } 
} 

我可以张贴的完整代码,如果它是必要的,但我敢肯定,误差必须在这里某处。

回答

1

的问题是在这里:

push(@lines, my @tokens = split(/\s+/, $_)); 

推一个阵列到另一个只是增加了第一个数组的所有元素。所以你正在制作一个非常长的一维数组。

为了解决这个问题,使用括号使数组引用:

push @lines, [ split(/\s+/, $_) ]; #No need for a temp variable. 

此外,要访问数组引用,你必须去参考它。这两种语法都是选项:

${$line}[$count]; 
    $line->[$count]; 

我认为第二种语法更具可读性。

更新:另外,如果你跟踪时间最长的长度,而你通过文件,你可以简化代码:

use strict; 
use warnings; 
use List::Util qw/max/; 

my @lines; 
my @sizes = (0)x6; 
while(<>) 
{ 
    push @lines, [ my @tokens = split ]; 
    @sizes = map { max (length($tokens[$_]), $sizes[$_]) } 0..$#tokens;  
} 

注:Data::Dumper核心模块是一个非常宝贵的工具,当在Perl中处理复杂的数据结构。

use Data::Dumper; 
print Dumper @lines; 

这将打印出你给它的任何变量的完整结构。这样你就可以看到你是否真的创造了你以前的想法。

+0

是的,我也将圆括号放在'split'上。 – Qtax 2013-03-27 10:59:59

+0

@Qtax,你可以使用'[split]'。 – 2013-03-27 11:09:46

+0

当然,如果你想走那么远。但是,如果你可以做到这一点,你就会在“push”而不是“split”的情况下删除括号。似乎不一致。 – Qtax 2013-03-27 11:12:00

相关问题