繁体   English   中英

在Perl中循环使用多维数组的一维

[英]Loop over one dimension of a multi-dimensional array in Perl using for each

*更新*为错别字

另一个PERL问题。...我试图遍历2D数组。 我对一个尺寸的大小很肯定,但对第二个尺寸不确定。 代码段:

foreach my $value (@surfaces[1])
                {
                    my $sum = 0;
                    my $smallest = 9999;
                    my $limit_surface = 0;
                    for (my $i = 0; $i < 3; $i++)
                    {
                        $sum += $surfaces[$i][$counter];
                        if ($surfaces[$i][$counter] <= $smallest)
                        {
                            $smallest = $surfaces[$i][$counter];
                            $limit_surface = $subchannel_number[$i];
                        }
                    }
                    $counter++;
                    push(@avg_value,$sum/@rodsurface_number);
                    push(@limiting_schan,$limit_surface);
                    push(@limiting_value,$smallest);
               }

我已编译,但$ value变量无法初始化。

在我之后重复:

Perl没有多维数组
Perl没有多维数组
Perl没有多维数组

Perl中做什么已经是有是包含指向其他数组引用 数组 您可以在Perl中模拟多维数组,但它们不是真正的多维数组。 例如:

my @array;
$array[0] = [ 1, 2, 3, 4, 5 ];
$array[1] = [ 1, 2, 3 ];
$array[2] = [ 1, 2 ];

我可以谈论$array[0][1]$array[2][1] ,但是虽然$array[0][3]存在,但$array[2][3]不存在。

如果您不了解参考资料,请阅读参考资料教程

您需要做的是遍历数组,然后找出每个子数组的大小并遍历每个子数组。 无法保证

  1. 您的主数组中包含的引用实际上指向另一个数组:
  2. 您的子数组仅包含标量数据。

您可以使用$#运算符来查找数组的大小。 例如, $#array$#array中的项目数。 您可以使用( 0..$#array )遍历( 0..$#array )每个项目,这样,您就可以使用索引了。

use strict;
use warnings;

my @array;
$array[0] = [ 1, 2, 3, 4, 5 ];
$array[1] = [ 1, 2, 3 ];
$array[2] = [ 1, 2, ];

#
# Here's my loop for the primary array.
#
for my $row ( 0..$#array ) {
    printf "Row %3d: ", $row ;
    #
    # My assumption is that this is another array that contains nothing
    # but scalar data...
    #
    my @columns = @{ $array[$row] };  # Dereferencing my array reference
    for my $column ( @columns ) {
        printf "%3d ", $column;
    }
    print "\n";
}

注意我做了my @columns = @{ $array[$row] }; 将我的参考转换回数组。 这是一个额外的步骤。 我可以简单地在for循环中完成解引用并保存一个步骤。

打印输出:

Row   0:   1   2   3   4   5 
Row   1:   1   2   3 
Row   2:   1   2 

我可以在这里进行一些安全检查。 例如,我可能想验证每一行的大小,如果一行与另一行不匹配,请抱怨:

my $row_size = $array[0];
for my $row ( 1..$#array ) {
    my @columns = @{ $array[$row] };
    if ( $#columns ne $array_size ) {
        die qq(This is not a 2D array. Not all rows are equal);
    }
}

您既不会描述数据结构,也不会确切解释您要使用的数据结构。 这限制了我们只能针对一般品种提供的建议。

如果您要遍历数组数组,我建议您基于元素而不是索引来进行。

例如,下面我有一个4×5的整数矩阵。 我想找到这些值的平均值。 一种方法是简单地遍历每一行,然后遍历每一列,然后累加值:

use strict;
use warnings;

my @AoA = (
    [11, 12, 13, 14, 15],
    [21, 22, 23, 24, 25],
    [31, 32, 33, 34, 35],
    [41, 42, 43, 44, 45],
);

my $sum = 0;
my $count = 0;

for my $row (@AoA) {
    for my $element (@$row) {    # <-- dereference the array ref
        $sum += $element;
        $count++;
    }
}

print "Average of Matrix is " . ($sum / $count) . "\n";

输出:

Average of Matrix is 28

有关复杂数据结构的更多信息,请查看: Perl Data Structures Cookbook

我设置了一些虚拟变量并更改了一些内容。 这将编译并产生我在下面显示的结果。

这可能不会回答您的问题,但是应该允许您复制和粘贴代码,自己运行代码,编辑输入以及查看输出与所需内容的比较。

use warnings;
use strict;
use Data::Dumper;
$Data::Dumper::Sortkeys = 1;

my @surfaces = ( ['1','2','3'],
            ['10','20','30'],
            ['100','200','400'],
            );

my @subchannel_number = ( ['1','2','3'],
            ['10','20','30'],
            ['100','200','400'],
            );  

my @rodsurface_number = (1 .. 10);
my $counter = 0;

my (@avg_value, @limiting_schan, @limiting_value);

foreach my $value ($surfaces[1]){
    my $sum = 0;
    my $smallest = 9999;
    my $limit_surface = 0;
        for (my $i = 0; $i < 3; $i++) {
            $sum += $surfaces[$i][$counter];
                if ($surfaces[$i][$counter] <= $smallest){
                    $smallest = $surfaces[$i][$counter];
                    $limit_surface = $subchannel_number[$i];
                }
        }
        $counter++;
        push(@avg_value,$sum/@rodsurface_number);
        push(@limiting_schan,$limit_surface);
        push(@limiting_value,$smallest);
}

print Dumper (\@avg_value, \@limiting_schan, \@limiting_value);

$VAR1 = [
          '11.1'
        ];
$VAR2 = [
          [
            '1',
            '2',
            '3'
          ]
        ];
$VAR3 = [
          1
        ];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM