Подтвердить что ты не робот

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

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

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

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

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

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

и

calc(@array, $scalar)

напечатает 51 M, когда я хочу 51 M 21.

4b9b3361

Ответ 1

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

calc(\@array, $scalar)

И затем войдите в него как: my @array = @{$_[0]};

Ответ 2

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

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

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

reversed_args($scalar, @array);

Не пробуйте Perl > прототипы (две статьи, одна на Stack Overflow, один на PerlMonks).

Ответ 3

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

calc(\@array, $scalar);

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

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

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

Ответ 4

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

calc(\@array, $scalar);

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

my $array = $_[0];

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

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

Ответ 5

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