*已更新*用于键入
另一个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
是数组中的项目数。您可以使用( 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
];