到目前为止,这里的所有其他回复对我来说似乎都相当复杂。当我编写 Perl 函数时,我通常在函数的第一行“展开”所有传递的参数。
sub someFunction {
my ( $arg1, $arg2, $arg3 ) = @_;
这类似于其他语言,您将函数声明为
... someFunction ( arg1, arg2, arg3 )
如果你这样做并将散列作为最后一个参数传递,那么没有任何技巧或特殊魔法就可以了。例如:
sub testFunc {
my ( $string, %hash ) = @_;
print "$string $hash{'abc'} $hash{'efg'} $string\n";
}
my %testHash = (
'abc' => "Hello,",
'efg' => "World!"
);
testFunc('!!!', %testHash);
输出如预期:
!!! Hello, World! !!!
这是有效的,因为在 Perl 中,参数总是作为标量值数组传递,如果你传递一个散列,它的键值/对被添加到该数组中。在上面的示例中,作为数组 ( ) 传递给函数的参数@_
实际上是:
'!!!', 'abc', 'Hello,', 'efg', 'World!'
和 '!!!' 被简单地分配给%string
,而%hash
“吞下”所有其他参数,总是将一个解释为键,下一个解释为值(直到所有元素都用完)。
您不能以这种方式传递多个散列,并且散列不能作为第一个参数,否则它会吞下所有内容并保留所有其他参数未分配。
当然,数组与最后一个参数完全相同。这里唯一的区别是数组不区分键和值。对他们来说,剩下的所有参数都是值,只是被推送到数组中。