Существуют прототипы Perl для изменения поведения синтаксического анализатора, что редко требуется. Это не исключение.
Если "beetroot
" не имеет других аргументов, вам следует просто использовать @_
вместо ссылки на массив.
sub aspirin {
my @items = qw'some items in here';
return @items if wantarray; # return a list in list context
return \@items;
}
sub beetroot {
print "$_\n" for @_;
}
my $L = aspirin;
beetroot @$L;
# the follow examples require the version of aspirin from this answer
my @L = aspirin;
beetroot @L;
beetroot aspirin; # aspirin called in list context
Это даст дополнительное преимущество: вам не нужно обходить синтаксический анализатор, если вы просто хотите ввести список элементов.
Это работает на новой версии, но не на версии, о которой идет речь.
beetroot qw'some items in here';
beetroot aspirin; # aspirin called in list context
Чтобы заставить его работать с тем, который в вопросе, вы должны создать анонимный массив. Интересно, что это также работает с версией в этом ответе.
beetroot @{ [qw'some items in here'] };
# the follow examples use the version of aspirin from this answer
beetroot @{ [aspirin] };
beetroot @{ scalar aspirin };
beetroot @{ aspirin };
Если вы действительно хотите, чтобы "beetroot
" работал с ссылками на массивы.
Я бы написал это так.
sub beetroot{
my($lst) = @_; # similar to my $lst = shift
print "$_\n" for @$lst;
}
my $L = aspirin;
beetroot $L;
my @L = aspirin; # using the aspirin from this answer
beetroot \@L;
beetroot [qw'some items in here'];
# the follow examples use the version of aspirin from this answer
beetroot scalar aspirin; # force aspirin to return an array reference
beetroot [ aspirin ]; # copy the array
Я бы написал так только в том случае, если вы хотите использовать ссылки для уменьшения объема памяти Perl или если у вас есть другие входные данные до "beetroot
".