我已经浏览了网站上的几个主题,包括这个主题,试着理解为什么我使用我的$ line得到一个未声明的变量错误。 @lines数组的每个元素都是一个字符串数组。
错误在第25行和第27行,带有$ line [$ 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]);
}
}
}
如果有必要,我可以发布完整的代码,但我很确定错误必须在某处。
答案 0 :(得分: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;
}
注意:在Perl中处理复杂数据结构时,Data::Dumper
核心模块是一个非常宝贵的工具。
use Data::Dumper;
print Dumper @lines;
这将打印出你给它的任何变量的完整结构。这样你就可以看出你是否真的创造了你认为你做过的事情。