1

我查看了网站上的几个线程,包括这个线程,试图理解为什么我在使用 $line 时遇到未声明的变量错误。@lines 数组的每个元素都是一个字符串数组。

错误在 $line[$count] 语句的第 25 行和第 27 行

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]);
        }
    }
}

如果有必要,我可以发布完整的代码,但我很确定错误一定在某个地方。

4

1 回答 1

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;

这将打印出您提供的任何变量的完整结构。这样你就可以看到你是否真的创造了你认为你所做的事情。

于 2013-03-27T10:55:42.310 回答