我在Perl的问题是: 使用匿名列表定义2x2阵列。将数组传递给子例程并将它们一起添加。返回对sum数组的引用,并打印程序主要部分的值。
我的脚本是:
#!/usr/bin/perl
use strict;
use warnings;
my @array = ([1,2],[4,5]);
my $refarray = \@array;
print sumarray($refarray);
sub sumarray
{
$refarray = shift;
foreach (@{$refarray})
{
$refarray = ($refarray[0]->[0]+$refarray[1]->[0],$refarray[0]->[1]+$refarray[1]->[1]);
}
return $refarray;
}
我哪里错了?请帮忙。提前致谢。
I am getting the output as 0.
如果我使用use strict;
和use warnings;
,我会收到错误消息
Global symbol "@refarray" requires explicit package name at line 23.
Global symbol "@refarray" requires explicit package name at line 23.
Global symbol "@refarray" requires explicit package name at line 23.
Global symbol "@refarray" requires explicit package name at line 23.
Execution aborted due to compilation errors.
答案 0 :(得分:3)
您的代码几乎没有问题: -
$refarray
。$refarray[0]->[0]
无法编译。由于$refarray
是对数组的引用,因此您应该使用箭头使用其第一个元素: - $refarray->[0][0]
,或者在使用您使用的方式之前需要取消引用它: - {{1 }}。话虽如此,我认为你应该用这个替换你的$$refarray[0]->[0]
: -
subroutine
输出: -
use strict;
use warnings;
my @array = ([1,2],[4,5]);
my $refarray = \@array;
my $sum = sumarray($refarray);
print $sum->[0], $sum->[1];
sub sumarray {
my $ref = shift;
return [$ref->[0][0] + $ref->[1][0], $ref->[0][1] + $ref->[1][1]];
}
答案 1 :(得分:2)
试试这个:
#!/usr/bin/perl -w
my $r = sumarray([1,2],[3,4]);
print $r->[0], " ", $r->[1], "\n";
sub sumarray {
my ($a, $b) = @_;
return [
$a->[0]+$b->[0],
$a->[1]+$b->[1]
];
}
答案 2 :(得分:2)
可以通过列表操作 sum (来自核心模块List::Util)和map的组合非常简单地表达。
#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';
use List::Util 'sum';
sub sum_square {
my @arrays = @_;
return [ map {sum @$_} @arrays ];
}
say join ', ' => @{ sum_square([1,2], [4,5]) };
<强>输出强>:
3, 9
由于这是Perl,因此可以用更紧凑的方式表达。
sub sum_square { [ map {sum @$_} @_ ] }
say join ', ' => @{ sum_square([1,2], [4,5]) };
say join ', ' => map {sum @$_} [1,2], [4,5];
如果函数应该是列总和而不是行和,则此修改应该执行技巧(迭代第一个数组的索引):
sub sum_square {
my @arrays = @_;
return [ map { my $i = $_; # $i: all indices of the first array
sum map $_->[$i] => @arrays # sum over all $i-th values of @arrays
} 0 .. $#{$arrays[0]} ];
}
输出:
5, 7