我有一个子程序,原型如下:
sub printFoo(%) {
my (%hashFoo)=@_;
# do stuff with the hash
}
Run Code Online (Sandbox Code Playgroud)
但我想有选择地传递第二个标量参数,如下所示:
sub printFoo(%;$) {
my (%hashFoo,$optionalArg)=@_;
# do stuff with the hash and the optional arg
}
Run Code Online (Sandbox Code Playgroud)
我知道在警告模式下这是禁止的,但我不确定为什么.
我想我可以使用全局变量标志,但是有关如何优雅地完成这种类型的函数签名的任何建议?
我不知道这算不算优雅,但是......
sub printFoo {
my $optionalArg;
if (@_ % 2 != 0) {
$optionalArg = pop @_;
}
my %hashFoo = @_;
...
}
Run Code Online (Sandbox Code Playgroud)
带有哈希引用的原型也可以工作。您仍然可以使用散列调用该函数,但您必须记住第一个散列参数将由您的子接收作为散列引用。
sub printFoo (\%;$) { # call as printFoo %foo or printFoo %foo, 42
my ($hashFooRef, $optionalArg) = @_;
my %hashFoo = %$hashFooRef;
...
}
Run Code Online (Sandbox Code Playgroud)