0

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.
4

3 に答える 3

3

あなたのコードにはいくつかの問題があります: -

  • まず、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
于 2012-11-02T08:21:45.950 に答える
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]
    ];
}
于 2012-11-02T08:11:13.177 に答える
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]) };

短縮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
于 2012-11-02T09:56:05.703 に答える