[英]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]
不存在。
如果您不了解参考资料,请阅读参考资料教程 。
您需要做的是遍历数组,然后找出每个子数组的大小并遍历每个子数组。 无法保证
您可以使用$#
运算符来查找数组的大小。 例如, $#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.