これを行うには、次の 2 つの方法があります。
- 試作品による
- 参照により
しかし、これらについて議論する前に、あなたが質問で示したことがあなたがやりたいことの範囲に関するものである場合は、提案させてくださいList::MoreUtils::pairwise
したがって、これをどこに書くか:
my @sum = two_array_sum( @a, @b )
あなたは単にこれを書くでしょう:
my @sum = pairwise { $a + $b } @a, @b;
試作品による
これは のように機能しpush
ます。(そして、何かにシジルをpush
要求するのと同じように)@
sub two_array_sub (\@\@) {
my ( $aref, $bref ) = @_;
...
}
こうするとこうなる
two_array_sub( @a, @b );
できます。通常は、1 つの長いリストとしてサブに表示されます。以下の私の議論でわかるように、それらは万人向けではありません。
参照により
それは、誰もがあなたに示している方法です。
some_sub( \@a, \@b );
試作品について
彼らは気難しいです。参照がある場合、これは機能しません:
two_array_sub( $arr_ref, $brr_ref );
次のように渡す必要があります。
two_array_sub( @$arr_ref, @$brr_ref );
ただし、「配列式」を作成すると、配列が深くネストされて非常に見苦しくなります。そのため、Perl が取得する参照の型を「文字クラス」構造に配置することでオーバーロードできるため、Perl の煩わしさを避けることがよくあります。\[$@]
参照がスカラーまたは配列のいずれかになる可能性があることを意味します。
sub new_two_array_sub (\[$@]\[$@]) {
my $ref = shift;
my $arr = ref( $ref ) eq 'ARRAY' ? $ref : $$ref; # ref -> 'REF';
$ref = shift;
my $brr = ref( $ref ) eq 'ARRAY' ? $ref : $$ref;
...
}
したがって、これらはすべて機能します。
new_two_array_sub( @a, $self->{a_level}{an_array} );
new_two_array_sub( $arr, @b );
new_two_array_sub( @a, @b );
new_two_array_sub( $arr, $self->{a_level}{an_array} );
しかし、Perl はまだこれにうるさいです... 何らかの理由で:
new_two_array_sub( \@a, $b );
OR
new_two_array_sub( $a, [ 1..3 ] );
または、配列への参照として表示される可能性のあるその他の「コンストラクター」。幸いなことに、古いPerl 4では Perl を黙らせることができます。 &
&new_two_array_sub( \@a, [ 1..3 ] );
次に、サブルーチンの多重化コードが 2 つの配列参照を処理します。