如何将两个列表传递给Perl子例程?

Mik*_*ike 5 perl arguments function

是否可以将两个列表传递给subPerl中的一个,例如:

sub Foo {
 my(@list1,@list2) = @_;

}
Run Code Online (Sandbox Code Playgroud)

我知道我可以制作@_两个列表,每个子列表都是所需的参数,我只是想知道是否有更清洁的方法

dao*_*oad 10

好吧,如果你想要两个数组,你可以使用原型:

sub foo (\@\@) {
   my $arr1 = shift;
   my $arr2 = shift;

   # Access arrays as references
}

foo( @wiz, @waz );  # @wiz and @waz won't be flattened.
Run Code Online (Sandbox Code Playgroud)

但是有许多方法可以绕过原型,我更喜欢在大多数地方避开它们.您可以简单地跳过原型并手动传递引用:

sub foo {
   my $arr1 = shift;
   my $arr2 = shift;

   # Access arrays as references
}

foo( \@wiz, \@waz ); # Pass in wiz/waz as refs
foo( [1,2,4],[3,5,6] );  # Hard coded arrays
Run Code Online (Sandbox Code Playgroud)

如果您还没有使用过引用,请查看perlreftut以获得一个很好的教程.

  • @Mike,我建议不要使用原型,因为经验丰富的perl程序员会比传递参考的要求更令他们感到惊讶.查看http://stackoverflow.com/questions/297034/why-are-perl-function-prototypes-bad,详细了解为什么原型不受欢迎. (14认同)
  • 实际上,最好避免使用原型.如果您尝试将prototyped子句称为对象方法,则可能会遇到令人惊讶的结果. (4认同)
  • 当您尝试传入内联生成的值而没有中间数组(例如`map`或`grep`的输出)时,引用原型可能有点烦人.但非参考原型可能非常有用.后一个`foo`例子也可以用这种方式调用:`foo \\(@ wiz,@ waz)` (2认同)

Bri*_*ach 5

如果你按值传递两个列表......你将获得一个大的列表@_.

my(@list1,@list2) = @_; 没有任何意义:

#!/usr/bin/perl

sub test
{
    my (@a, @b) = @_;

    print "@a\n";
    print "@b\n";
}

my @array1 = (1,2,3);
my @array2 = (5,6,7);

test(@array1, @array2);
Run Code Online (Sandbox Code Playgroud)

这将最终打印:

1 2 3 5 6 7
<blank line> 
Run Code Online (Sandbox Code Playgroud)

要传递两个数组,您需要通过引用传递它们:

test(\@array1, \@array2);
Run Code Online (Sandbox Code Playgroud)

在您的潜艇中,您需要将它们视为参考:

sub test
{
    my ($arrayRef1, $arrayRef2) = @_;
    print "@$arrayRef1\n";
    print "@$arrayRef2\n";
}
Run Code Online (Sandbox Code Playgroud)