有两种方法可以做到这一点:
- 按原型
- 参考
但在我讨论这些之前——如果你在问题中展示的是关于你想做的事情的程度——让我建议List::MoreUtils::pairwise
那么,你会在哪里写这个:
my @sum = two_array_sum( @a, @b )
你只需写这个:
my @sum = pairwise { $a + $b } @a, @b;
按原型
这类似于push。 (就像 push 它要求在 something 上有一个 @ 印记)
sub two_array_sub (\@\@) {
my ( $aref, $bref ) = @_;
...
}
当你这样做的时候就这样
two_array_sub( @a, @b );
它有效。而通常它只会在您的子列表中显示为一个长列表。正如您将在下面的讨论中看到的那样,它们并不适合所有人。
参考
这是每个人都向您展示的方式。
some_sub( \@a, \@b );
关于原型
他们很挑剔。如果您有 refs,这将不起作用:
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 ] );
然后子中的复用代码负责处理两个数组引用。