Этот вопрос относится к последнему пункту пункта 46 в Эффективное программирование на Perl .
Я протестировал эту функцию, которая позволяет передавать ссылки на массивы, но обращаться к ним как к локальным массивам:
use strict;
sub max_v_local {
local ( *a, *b ) = @_;
my $n = @a > @b ? @a : @b;
my @result;
for ( my $i = 0 ; $i < $n ; $i++ ) {
push @result, $a[$i] > $b[$i] ? $a[$i] : $b[$i];
}
@result;
}
Но я получаю следующие ошибки, если не использую strict
:
Variable "@a" is not imported
Variable "@b" is not imported
Global symbol "@a" requires explicit package name
Global symbol "@b" requires explicit package name
Есть ли способ сделать это с strict
?
Обновление
Дальнейшая предыстория. Вышеуказанная подпрограмма была уточнением следующего. Подпрограмма принимает 2 arrayrefs, но использование arrayrefs в подпрограмме может привести к путанице. Приведенный выше код, вероятно, будет быстрее и более читабельным, поскольку он позволяет вам обращаться к arrayrefs как к локальным массивам.
sub max_v {
my ( $a, $b ) = @_;
my $n = @$a > @$b ? @$a : @$b; # no. of items
my @result;
for ( my $i = 0 ; $i < $n ; $i++ ) {
push @result, $$a[$i] > $$b[$i] ? $$a[$i] : $$b[$i];
}
@result;
}
До этого я не обращал особого внимания на шарики, поэтому сейчас я на них смотрю. Оказывается, они не такие сложные, как я думал.