Ответ 1
Вам нужно передать его в качестве ссылки:
calc(\@array, $scalar)
И затем войдите в него как: my @array = @{$_[0]};
Возможный дубликат: Как передать один массив и одну строку в качестве аргументов функции?
У меня есть функция или подпрограмма, которая принимает первый параметр как массив, а второй - как скаляр. Например,
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
.
Вам нужно передать его в качестве ссылки:
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 > прототипы (две статьи, одна на Stack Overflow, один на 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];
Изменить: поскольку это ссылка на исходный массив, любые изменения, сделанные в подпрограмме, будут отражены в исходном массиве.
Список аргументов в подпрограмме Perl - это просто плоский массив. Если вы хотите передать отдельный массив, вы должны передать его как ссылку на массив.