两次调用Perl GetOptions无法按预期工作

jar*_*mod 3 perl

我很难找到解释此行为的Perl GetOptions参考.

如果我调用GetOptions两次,那么第二次调用它时,它无法解析命令行参数,并且它们都返回undefined.第一次调用GetOptions(顺便说一下,失败并返回0)是否吃了命令行参数,或者第二次调用是否只是决定不打扰解析,因为它记得先前已经失败了?

不要问我为什么两次调用GetOptions - 这是因为代码重构很复杂,除非必要,否则我不愿意.我只想要一个简单的方法,在对GetOptions的"真正"调用之前,测试是否存在单个命令行参数.谢谢.

Rob*_*edy 8

GetOptions 消耗和修改@ARGV阵列.在调用该函数之后,通常留在该数组中的所有内容都是文件名参数.

如果您没有存储数组的副本以便以后可以重置,那么后续GetOptions调用将无需解析任何内容.您可以尝试GetOptionsFromArray使用任意数组调用,而不是使用隐式数组@ARGV.


Cas*_*bel 5

GetOptions从中删除选项@ARGV,只留下实际参数,以便程序的其余部分在处理时不必知道选项@ARGV.我没有在文档中明确提到这一点,但它是选项解析器通常如何工作的方式.

这确实意味着第二次调用它将是非常无用的,除非你有一些复杂的模式用于这样的选项:--section1-opt1 --section1-opt2 -- --section2-opt1 --section1-opt2 -- <real arguments>.第一个调用将在第一个终止时占用,第二个调用将--解析下一个部分直到第二个--.但我无法想象它是最友好的接口.

  • 使用最近的Getopt :: Long,然后"使用Getopt :: Long qw/pass_through /;" - 您第一次调用GetOptions然后只会从它知道的@ARGV中删除选项,而不是全部. (5认同)