Передать массив и скаляр в подпрограмму Perl [duplicate]

Возможные Дубликаты: как передать один массив и одну строку в качестве аргументов функции?

у меня есть функция или подпрограмма, которая принимает первый параметр как массив, а второй параметр как скаляр. Например,

sub calc {
    my @array = $_[0];
    my $scalar = $_[1];
    print @array, $scalar;
}

проблема в том, что функция делает массив равным первому значению переданного массива, а скаляр-второму значению переданного массива. Когда я хочу, чтобы первый массив был всем массивом, мне не нужно делать глубокую копию массива. Например,

my @array = ('51', 'M');
my $scalar = 21;

и

calc(@array, $scalar)

печати 51 M когда я хочу!--4-->.

5 ответов


вам нужно передать его в качестве ссылки:

calc(\@array, $scalar)

и затем получить к нему доступ как:my @array = @{$_[0]};


либо используйте ссылку на массив в качестве первого аргумента, либо измените аргументы так, чтобы скаляр был первым, а массив-следующим:

sub reversed_args
{
   my($scalar, @array) = @_;
   # ...
   print @array, $scalar, "\n";
}

my @array = ('51', 'M');
my $scalar = 21;

reversed_args($scalar, @array);

не пробовал Perl прототипы (две статьи, одна о переполнении стека, одна на PerlMonks).


передайте свой массив подпрограмме calc в виде массива ref:

calc(\@array, $scalar);

затем в подпрограмме calc вы инициализируете свои входные параметры следующим образом:

sub calc {
  my($array_ref, $scalar) = @_;

  foreach my $item (@$array_ref) {
    # process each item in the array ref
  }
}

Вы можете передать ссылку на массив в функцию:

calc(\@array, $scalar);

когда вам нужно получить доступ к элементам @ array в вашей подпрограмме, вы можете сделать это следующим образом:

my $array = $_[0];

# access first element of array
print $array->[0];

Edit: поскольку это ссылка на исходный массив, любые изменения, внесенные в подпрограмму, будут отражены в исходном массиве.


список аргументов в подпрограмме Perl - это просто плоский массив. Если вы хотите передать отдельный массив, вы должны передать его как ссылку на массив.