2011-01-19 30 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(...); 
相關問題