【问题标题】:Perl 2x2 array addition using Subroutines and Reference使用子例程和参考的 Perl 2x2 数组添加
【发布时间】:2012-11-02 18:18:43
【问题描述】:

我在 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.

【问题讨论】:

  • 你是如何得到这个输出的?该代码甚至无法编译。

标签: perl


【解决方案1】:

你的代码有几个问题:-

  • 首先,在您的 for 循环中,您正在修改您不应该这样做的引用 $refarray
  • 其次,$refarray[0]->[0] 不会编译。由于$refarray 是对数组的引用,因此您应该使用箭头使用它的第一个元素:-$refarray->[0][0],或者您需要在使用之前取消引用它:-$$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]];
}

输出:-

5 7

【讨论】:

  • 问题要求一个arrayref,逗号可能是为了尝试这样做(尽管他正在制作一个数组而不是arrayref)。
  • 根据问题,我无法理解输出必须是3,9还是5,7。困惑。
  • @user1613245。我认为它需要5 7。第一次没有完全理解。但我认为你已经得到了 2 个答案:) 这个想法是,你使用你的参考像 array 而不是 reference
【解决方案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]
    ];
}

【讨论】:

  • 如果有use strict就更好了。
【解决方案3】:

可以很简单地用列表操作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]) };

缩短2

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 2021-03-09
    • 2013-12-24
    • 1970-01-01
    • 2015-07-06
    相关资源
    最近更新 更多