有两种方法可以做到这一点:
- 按原型
- 引用
但在我讨论这些之前——如果你在问题中展示的是关于你想做的事情的程度——让我建议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 );
有用。而通常它只会在您的子列表中显示为一个长列表。正如您将在下面的讨论中看到的那样,它们并不适合所有人。
引用
这就是每个人都向你展示的方式。
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 ] );
然后 sub 中的 mux-ing 代码负责处理两个数组引用。