Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 2d arr显式包装_Arrays_Perl_Foreach - Fatal编程技术网

Arrays 2d arr显式包装

Arrays 2d arr显式包装,arrays,perl,foreach,Arrays,Perl,Foreach,我已经浏览了网站上的几个线程,包括这一个,试图理解为什么我在使用$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(/

我已经浏览了网站上的几个线程,包括这一个,试图理解为什么我在使用$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]);
        }
    }
}
使用严格;
使用警告;
我的@行;
我的@尺寸;
#将输入从标准输入文件读入二维数组
while()
{
推送(@lines,my@tokens=split(/\s+/,$);
}
#搜索每个数组中的最大大小
#对应元素
对于(my$count=0;$count$sizes[$count])
{
$size[$count]=长度($line[$count]);
}
}
}
如果有必要,我可以发布完整的代码,但我确信错误一定在这里的某个地方。

问题在这里:

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;    
}
这将打印出给定变量的完整结构。这样你就可以看到你是否真的创造了你认为你所做的。

问题在于:

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

这将打印出给定变量的完整结构。这样你就可以看到你是否真的创造了你认为你所做的。

是的,我也会把括号放在
split
上。@Qtax,你可以用
[split]
。当然,如果你想做到这一点。但您删除了
push
上的括号,但没有删除
split
,因为您可以很好地执行此操作。似乎不一致。非常感谢您提供的信息。我正在上一堂脚本编写的入门课,这需要花时间去适应它与c++/javaYea之间的差异,我也会把括号放在
split
上。@Qtax,你可以用
[split]
。当然,如果你想那么做的话。但您删除了
push
上的括号,但没有删除
split
,因为您可以很好地执行此操作。似乎不一致。非常感谢您提供的信息。我正在上一堂脚本编写的入门课,要花时间去适应它与c++/java之间的差异