Есть два способа сделать это:
- по прототипу
- по ссылке
Но прежде чем обсуждать это - если то, что вы показываете в своем вопросе, касается степени того, что вы хотите сделать, - позвольте мне предложить 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 по этому поводу со старым Perl 4 &
&new_two_array_sub( \@a, [ 1..3 ] );
Тогда код мультиплексирования в подпрограмме позаботится о обработке двух ссылок на массивы.