你可以用两种方法来实现这个:
- 通过原型
- 通过引用
但在我讨论这些之前--如果你在问题中展示的是你想要完成的全部内容--让我建议使用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 = 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 ] );
然后,子程序中的mux-ing代码负责处理两个数组引用。