使用子例程和引用的Perl 2x2数组加法

使用子例程和引用的Perl 2x2数组加法,perl,Perl,我在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 (@

我在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.
如果我使用
则使用strict
使用警告我将获得错误消息,如下所示

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.
试试这个:

#!/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]
    ];
}

您的代码有几个问题:-

  • 首先,在for循环中,您正在修改引用
    $refarray
    ,这是您不应该做的
  • 其次,
    $refarray[0]->[0]
    将不会编译。由于
    $refarray
    是对数组的引用,您应该使用箭头使用它的第一个元素:-
    $refarray->[0][0]
    ,或者在使用之前需要取消引用它:-
    $$refarray[0]->[0]
话虽如此,我认为您应该将
子例程
替换为以下一个:-

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]];
}
输出:-

5 7

它可以非常简单地用列表操作sum(来自核心模块)和的组合来表示

密码 输出

3, 9
因为这是Perl,所以可以用更紧凑的方式表示

缩短 缩写2 编辑:反过来求和 如果函数应为列和而不是行和,则此修改应起作用(迭代第一个数组的索引):

输出:

5, 7

你是怎么得到这个结果的?这段代码甚至无法编译。问题是需要一个arrayref,逗号可能是一种尝试(尽管他正在制作一个数组而不是arrayref)。根据问题,我无法理解输出必须是3,9还是5,7。混淆了。@user1613245。我想它需要
57
。不是第一次完全弄明白的。但是我认为你已经得到了两个答案:)想法是,你使用你的引用就像一个
数组
而不是
引用
。如果它有
使用严格的
会更好。
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