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

时间:2011-01-19 18:49:39

标签: perl

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

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

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

3 个答案:

答案 0 :(得分:8)

GetOptions 使用和修改 @ARGV数组。调用该函数后,该数组中通常留下的所有内容都是文件名参数。

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

作为already pointed out@ARGV修改GetOptions。虽然不是很好看,但您可以声明@ARGV local:

{
local(@ARGV) = @ARGV;
GetOptions(...);
}

# @ARGV "restored" here    
GetOptions(...);