可能重复: How do pass one array and one string as arguments to a function?
我有一个函数或子例程,它将第一个参数作为数组,第二个参数作为标量。例如,
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
。
答案 0 :(得分:48)
您需要将其作为参考传递:
calc(\@array, $scalar)
然后将其访问为:my @array = @{$_[0]};
答案 1 :(得分:16)
使用对数组的引用作为第一个参数,或者反转参数以使标量为第一个,然后是数组:
sub reversed_args
{
my($scalar, @array) = @_;
# ...
print @array, $scalar, "\n";
}
my @array = ('51', 'M');
my $scalar = 21;
reversed_args($scalar, @array);
请勿尝试Perl prototypes(两篇文章,一篇关于Stack Overflow,一篇关于PerlMonks)。
答案 2 :(得分:10)
将数组作为数组ref:
传递给calc子程序calc(\@array, $scalar);
然后在calc子程序中,初始化输入参数,如下所示:
sub calc {
my($array_ref, $scalar) = @_;
foreach my $item (@$array_ref) {
# process each item in the array ref
}
}
答案 3 :(得分:9)
您可以将对数组的引用传递给您的函数:
calc(\@array, $scalar);
当您需要在子程序中访问@array的元素时,您可以这样做:
my $array = $_[0];
# access first element of array
print $array->[0];
编辑:由于这是对原始数组的引用,因此子例程中所做的任何更改都将反映在原始数组中。
答案 4 :(得分:1)
Perl子例程中的参数列表只是一个平面数组。如果要传递一个不同的数组,则必须将其作为数组引用传递。