37

可能重复: 如何将一个数组和一个字符串作为参数传递给函数?

我有一个函数或子例程,它将第一个参数作为数组接收,将第二个参数作为标量接收。例如,

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

4

5 回答 5

64

您需要将其作为参考传递:

calc(\@array, $scalar)

然后访问它:my @array = @{$_[0]};

于 2012-05-23T23:03:00.437 回答
19

要么使用对数组的引用作为第一个参数,要么反转参数,以便标量在前,数组在后:

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)。

于 2012-05-23T23:07:11.330 回答
12

将您的数组作为数组引用传递给 calc 子例程:

calc(\@array, $scalar);

然后在您的 calc 子例程中,初始化输入参数,如下所示:

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

  foreach my $item (@$array_ref) {
    # process each item in the array ref
  }
}
于 2012-05-23T23:04:58.913 回答
11

您可以将对数组的引用传递给您的函数:

calc(\@array, $scalar);

当您需要在子例程中访问 @array 的元素时,您可以这样做:

my $array = $_[0];

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

编辑:由于这是对原始数组的引用,因此在子例程中所做的任何更改都将反映在原始数组中。

于 2012-05-23T23:04:54.340 回答
1

Perl 子例程中的参数列表只是一个平面数组。如果要传递不同的数组,则必须将其作为数组引用传递。

于 2012-05-23T23:02:41.267 回答