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

标签 perl

我有一个带有这样原型(prototype)的子程序:

sub printFoo(%) {
    my (%hashFoo)=@_;
    # do stuff with the hash
}

但我想有选择地传入第二个标量参数,如下所示:
sub printFoo(%;$) {
    my (%hashFoo,$optionalArg)=@_;
    # do stuff with the hash and the optional arg
}

我知道在警告模式下这是一个禁忌,但我不知道为什么。

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

最佳答案

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

sub printFoo {
    my $optionalArg;
    if (@_ % 2 != 0) {
        $optionalArg = pop @_;
    }
    my %hashFoo = @_;
    ...
}

带有哈希引用的原型(prototype)也可以工作。您仍然会使用散列调用该函数,但您必须记住第一个散列 arg 将被您的子作为散列引用接收。
sub printFoo (\%;$) {  # call as  printFoo %foo  or  printFoo %foo, 42
    my ($hashFooRef, $optionalArg) = @_;
    my %hashFoo = %$hashFooRef;
    ...
}

关于perl - 带有散列和可选标量参数的子例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32399603/

相关文章:

perl - 如何将用户输入的多行写入文件 (Perl)

perl - 为什么Perl不让我从后缀比较中链接后缀循环?

perl - MooseX::Types 声明问题,严格的测试用例:)

perl - 动态添加列到 DBIx::Class ResultSet

perl - unix 或 perl 一个 liner 用于同时跟踪多个文件

linux - 递归更改文件夹和子文件夹中的文件名而不更改文件路径

python - 使用文件夹名称作为文本文件中的一列

php - 在支持 ajax 的网站上自动执行操作的脚本

perl - 如何使用OLE模块处理Excel?

perl - Perl : re-loading hash values possible? 中的快速查找