2011-01-19 87 views
3

我正在努力寻找解释此行为的Perl GetOptions参考。两次调用Perl GetOptions无法按预期方式工作

如果我两次调用GetOptions,那么我第二次调用它时,它不能分析命令行参数,并且它们都返回undefined。第一次调用GetOptions(顺便说一句,失败并返回0)吃掉了命令行参数,还是第二次调用简单地决定不打扰解析,因为它记得它以前失败了?

不要问我为什么要两次调用GetOptions - 这是因为代码将很难重组,我宁愿不去除非必要。我只想一个简单的方法,在'真正'调用GetOptions之前,测试是否存在单个命令行参数。谢谢。

+0

请参阅Penfold评论我的答案。这可能正是你需要的。 – Cascabel 2011-01-19 19:46:59

回答

8

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

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

+1

非选项参数不一定是文件名... – ysth 2011-01-20 02:59:31

5

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

这确实意味着再次调用它将会非常无用,除非您对这样的选项有一些复杂的架构:--section1-opt1 --section1-opt2 -- --section2-opt1 --section1-opt2 -- <real arguments>。第一个电话会吃掉第一个终止的--,第二个电话会解析下一个部分,直到第二个--。尽管如此,我无法想象它是最友好的界面。

+5

使用最近的Getopt :: Long,并且“使用Getopt :: Long qw/pass_through /;” - 您第一次调用GetOptions时,将只从它所知道的@ARGV中删除选项,而不是全部。 – Penfold 2011-01-19 19:37:39

+0

将考虑该选项,谢谢。 – jarmod 2011-01-19 20:30:40

3

由于already pointed out@ARGVGetOptions修改。虽然不是一个美丽的景象,你可以声明@ARGV本地:

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

# @ARGV "restored" here  
GetOptions(...); 
相关问题