【问题标题】:Getopt::Long & subroutines in GetOptionsGetOptions 中的 Getopt::Long & 子例程
【发布时间】:2019-02-18 15:27:52
【问题描述】:

是否有可能将参数传递给通过 getopt::long 调用的子程序? 例如,当用户在命令行上指定 script.pl -pandora 参数 时,我有此代码调用 &Salt

GetOptions (            "domain=s"    => \$domain,
                        "pandora=s"   => \&Salt,
                        "reverse=s"   => \$reverse,
                        "help"        => \&Usage)
       or die(&Usage);

如何将参数传递给 Salt ? 尝试了几件事,例如:

GetOptions (            "domain=s"    => \$domain,
                        "pandora=s"   => \&Salt($pandora),
                        "reverse=s"   => \$reverse,
                        "help"        => \&Usage)
       or die(&Usage);

甚至

    GetOptions (            "domain=s"    => \$domain,
                            "pandora=s"   => \&Salt($_[1]),
                            "reverse=s"   => \$reverse,
                            "help"        => \&Usage)
       or die(&Usage);

但它不会工作

我知道我可以通过 => $pandora 使其工作,然后在代码中使用 if ($pandora) { &Salt($pandora) } 的条件,但我会发现直接放置 sub 更好如果可能的话,在 getOptions 中

谢谢

【问题讨论】:

    标签: perl arguments


    【解决方案1】:
    "pandora=s" => sub { my ($optname, $optval) = @_; Salt($optval) },
    

    它也可以处理哈希。

    请参阅文档中的 User-defined subroutines to handle options 部分。

    【讨论】:

    • 感谢您的快速回答。像魅力一样工作(将在几分钟内将其标记为已解决)
    • 如果我没记错的话,你忘了= @_ ;)
    • 我更喜欢"pandora=s" => sub { my $value = $_[1]; Salt($value) },,因为无论如何都不使用第一个参数,甚至"pandora=s" => sub { Salt($_[1]) },。由于 sub 如此短,直接使用 $_[1] 实际上会使发生的事情变得不那么模糊 - 只要您深入了解 sub{} 在 GetOptions 中调用的两个参数即可。
    • @Silvar 如果你有一个哈希值,可以有三个参数。这段代码试图解释,而不是简短。我也会跳过多余的分配。 :)
    • @jhnc 呵呵,你每天都在学习(或被提醒)一些新东西。我没有在 GetOptions 中使用哈希的习惯,因此忘记或从未费心学习它们的使用。如果用例可以从中受益,也许下次我会记住这一点。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    相关资源
    最近更新 更多