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

38

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

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

sub calc {
    my @array = $_[0];
    my $scalar = $_[1];
    print @array, $scalar;
}

问题在于该函数使数组等于传入的数组的第一个值,并将标量设置为传入的数组的第二个值。当我想要第一个数组是整个数组时,就不需要对数组进行深复制。例如:

my @array = ('51', 'M');
my $scalar = 21;
< p>和< /p>
calc(@array, $scalar)

当我想要输出 51 M 21 时,将会打印出 51 M

5个回答

70

您需要将其作为引用传递:

calc(\@array, $scalar)

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


5
请注意,我的回答的第二部分将复制该数组。您也可以将其保留为引用,并在函数中适当访问它。 - happydave
这实际上并不起作用,我尝试过了。你测试过吗? - E.Cross
抱歉,我猜想@符号是在[0]之前应用的。我放了一个固定版本,将$_[0]用大括号括起来。 - happydave
优雅的答案 - 非常感谢。 - Bede Constantinides
@happydave,你会如何循环遍历@array数组的元素? - Alexander Cska

19
要么将数组作为第一个参数引用,要么反转参数,使标量先出现,数组在后面。
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上)。

不尝试使用原型的要点是什么? - Peter Mortensen
2
最简短的形式是“不要使用Perl原型”; 接下来最简短的形式是“Perl函数原型不像你期望的那样工作,专家建议你不要尝试使用它们”。冗长的版本大致是这样的:“Perl原型是一个失败的实验,在使用时会带来更多的困扰和烦恼,而不是有用的帮助,导致难以诊断的问题 - 沿着这条路走只会带来绝望和疯狂”。 - Jonathan Leffler

14
将你的数组作为一个数组引用传递给calc子例程:
calc(\@array, $scalar);

然后在你的calc子程序中,你需要像这样初始化输入参数:

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

  foreach my $item (@$array_ref) {
    # process each item in the array ref
  }
}

11
你可以将数组的引用传递给你的函数:
calc(\@array, $scalar);

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

my $array = $_[0];

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

编辑:由于这是对原始数组的引用,所以在子程序中进行的任何更改都会反映在原始数组中。


2
太棒了,我知道这是一些语法问题,谢谢! - E.Cross
@丹,这不是语法错误。问题在于你没有理解子调用的参数列表被视为一个表达式,而不是一系列逗号分隔的表达式。 - ikegami
1
我已经弄清楚了,所以我不同意。我只是不知道如何告诉perl我正在通过一个数组。 - E.Cross
@Dan 如果您对我的答案满意,能否接受它? - Peter Willsey
1
你应该告诉提问者,传递一个引用将允许子程序改变原始数组。 - TLP

1
在 Perl 子程序中的参数列表只是一个平面数组。如果你想传递一个不同的数组,你必须将它作为一个数组引用传递。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接