#perl
#perl
Вопрос:
Мне нравится эта ситуация.
my %ha = ()
my @ar = ('1','2')
my $st = 't'
f(%ha,@ar,$st);
sub f
{
my (%h, @a,$s) = @_;
или
my %h = shift;
my @a shift;
my $s = shift;
}
оба не работают. Что я могу сделать?
Комментарии:
1. Пожалуйста, прочитайте perldoc.perl.org/perlsub для получения дополнительной информации о вызове подпрограмм и разборе параметров.
Ответ №1:
Вы не можете передавать сложные структуры данных в качестве аргументов — они распаковываются в списки значений, и ваша подпрограмма не может определить, где находятся границы.
Что вы можете сделать, это передать ссылки вместо:
my %hash = ()
my @arr = ('123','456')
my $str = 'test'
sub func
{
my ( $hashref, $arrayref, $str ) = @_;
my %copy_of_hash = %$hashref;
my @copy_of_array = @$arrayref;
## or you can do it by following the reference to modify the hash without copying it:
$hashref->{'key'} = "value";
}
func ( %hash, @arr, $str );
Комментарии:
1. Nit: можно передавать ссылки . Передача по ссылке означает что-то другое (а Perl всегда передает по ссылке).
Ответ №2:
Из https://perldoc.perl.org/perlreftut
[ ITEMS ] создает новый анонимный массив и возвращает ссылку на этот массив. { ITEMS } создает новый анонимный хэш и возвращает ссылку на этот хэш.
$aref = [ 1, "foo", undef, 13 ];
# $aref now holds a reference to an array
$href = { APR => 4, AUG => 8 };
# $href now holds a reference to a hash
Таким образом, вы можете выполнить создание и ссылку за один шаг. Я считаю, что это проще и понятнее, чем обратная косая черта.