Как отправить и получить строку, массив и хэш в функции perl

#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
 

Таким образом, вы можете выполнить создание и ссылку за один шаг. Я считаю, что это проще и понятнее, чем обратная косая черта.