在Perl中,是否可以将两个列表传递给
sub
?例如:sub Foo {
my(@list1,@list2) = @_;
}
我知道我可以创建两个列表,每个子列表都是所需的参数,我只是想知道是否有更简洁的方法。
如果你想要两个数组,你可以使用一个原型:
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,这是一个不错的教程。
@_
。
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";
}
map
或grep
的输出)时,引用原型可能有点麻烦。然而,非引用原型可以非常有用。后者foo
的示例也可以这样调用:foo \\(@wiz, @waz)
。 - Eric Strom(\@)
原型的函数是语法错误。它需要是@{[ map {} ... ]}
... 这最终并没有提高可读性,只是在解析器无法理解的完全明确的情况下工作。 - Eric Strom