到目前为止,这里的其他回复似乎对我来说都很复杂。当我编写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
则“吞噬”所有其他参数,始终将一个参数解释为键,下一个参数解释为值(直到使用完所有元素)。
您无法以此方式传递多个哈希,并且哈希不能是第一个参数,否则它将吞噬所有其他参数并使其未分配。
当然,对于作为最后一个参数的数组,完全相同的方法也适用。唯一的区别在于数组不区分键和值。对于它们来说,所有剩余的参数都是值,并且只需将它们推送到数组中即可。