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

时间:2010-05-21 16:57:40

标签: perl function arguments

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

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

}

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

2 个答案:

答案 0 :(得分:10)

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

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

   # Access arrays as references
}

foo( @wiz, @waz );  # @wiz and @waz won't be flattened.

但是有许多方法可以绕过原型,我更喜欢在大多数地方避开它们。您可以直接跳过原型并手动传递参考:

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

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

答案 1 :(得分: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);

这将最终打印:

1 2 3 5 6 7
<blank line> 

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

test(\@array1, \@array2);

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

sub test
{
    my ($arrayRef1, $arrayRef2) = @_;
    print "@$arrayRef1\n";
    print "@$arrayRef2\n";
}