将数组和标量传递给Perl子例程

时间:2012-05-23 22:58:27

标签: perl reference subroutine

  

可能重复:   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

5 个答案:

答案 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子例程中的参数列表只是一个平面数组。如果要传递一个不同的数组,则必须将其作为数组引用传递。