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

E.C*_*oss 29 perl reference subroutine

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

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

sub calc {
    my @array = $_[0];
    my $scalar = $_[1];
    print @array, $scalar;
}
Run Code Online (Sandbox Code Playgroud)

问题是该函数使数组等于传入的数组的第一个值,并且标量是传入的数组的第二个值.当我想要第一个数组是整个数组时,我不知道需要制作数组的深层副本.例如,

my @array = ('51', 'M');
my $scalar = 21;
Run Code Online (Sandbox Code Playgroud)

calc(@array, $scalar)
Run Code Online (Sandbox Code Playgroud)

51 M在我想要的时候打印51 M 21.

hap*_*ave 49

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

calc(\@array, $scalar)

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

  • 请注意,我的答案的第二部分将制作数组的副本.您也可以将其作为参考,并在整个功能中适当地访问它 (4认同)

Jon*_*ler 16

使用对数组的引用作为第一个参数,或者反转参数,以便标量是第一个,然后是数组:

sub reversed_args
{
   my($scalar, @array) = @_;
   # ...
   print @array, $scalar, "\n";
}

my @array = ('51', 'M');
my $scalar = 21;

reversed_args($scalar, @array);
Run Code Online (Sandbox Code Playgroud)

不要尝试Perl 原型(两篇文章,一篇关于Stack Overflow,一篇关于PerlMonks).

  • 最短的形式是“不要使用 Perl 原型”;下一个最短的形式是“Perl 函数原型不能像您期望的那样工作,专家建议您不要尝试使用它们”。长篇大论的版本沿着“Perl 原型是一个失败的实验,它在使用时造成的悲痛和惊慌比有用的帮助更多,导致难以诊断的问题——沿着这条路走下去是绝望和疯狂”。 (2认同)

Sam*_*kri 10

将数组作为数组ref传递给calc子例程:

calc(\@array, $scalar);
Run Code Online (Sandbox Code Playgroud)

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

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

  foreach my $item (@$array_ref) {
    # process each item in the array ref
  }
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*sey 9

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

calc(\@array, $scalar);
Run Code Online (Sandbox Code Playgroud)

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

my $array = $_[0];

# access first element of array
print $array->[0];
Run Code Online (Sandbox Code Playgroud)

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

  • 很酷,我知道这是一些语法问题,谢谢! (2认同)