带有散列和可选标量参数的子例程

Jon*_*ink 5 perl

我有一个子程序,原型如下:

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)

我知道在警告模式下这是禁止的,但我不确定为什么.

我想我可以使用全局变量标志,但是有关如何优雅地完成这种类型的函数签名的任何建议?

mob*_*mob 4

我不知道这算不算优雅,但是......

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)