在Perl中使用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是数组中的项目数。您可以使用( 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
        ];

相关内容

  • 没有找到相关文章

最新更新