Передать массив и скаляр в подпрограмму 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 - это просто плоский массив. Если вы хотите передать отдельный массив, вы должны передать его как ссылку на массив.