2010-06-08 81 views
17

解析ARGS時,如果我有一個命令行,如:我怎樣才能讓不確定的選項與的Getopt

my_script.pl -foo -WHATEVER 

我的腳本知道--foo,和我想的Getopt設置變量$opt_foo,但我不知道關於-WHATEVER的任何內容。我如何告訴Getopt解析出我已經講過的選項,然後將其餘的參數取到字符串變量或列表中?

一個例子:

use strict; 
use warnings; 

use Getopt::Long; 

my $foo; 

GetOptions('foo' => \$foo); 

print 'remaining options: ', @ARGV; 

接着,頒發

perl getopttest.pl -foo -WHATEVER

 
Unknown option: whatever 
remaining options: 

回答

20

,你需要通過Getopt::Long::Configure("pass_through");

配置「pass_through」選項,則支持實際的選項(例如東西開始以「 - 」,沒有特殊的「 - 」分隔符來表示的「真實」選項的結束) 。

這裏的perldoc報價

  • pass_through(默認禁用)

    選項是未知的,不明確的或無效的選項值提供通過傳遞在@ARGV,而不是被標記爲錯誤。這使得可以編寫僅處理用戶提供的命令行參數的一部分的包裝腳本,並將其餘選項傳遞給其他程序。

下面是一個例子

$ cat my_script.pl 
#!/usr/local/bin/perl5.8 -w 

use Getopt::Long; 
Getopt::Long::Configure("pass_through"); 
use Data::Dumper; 
my %args; 
GetOptions(\%args, "foo") or die "GetOption returned 0\n"; 
print Data::Dumper->Dump([\@ARGV],["ARGV"]); 

$ ./my_script.pl -foo -WHATEVER   
$ARGV = [ 
      '-WHATEVER' 
     ]; 
+1

哈哈,這可以解釋爲什麼我沒有找到它...... :) – Ether 2010-06-09 00:08:41

+4

我發現它絕對令人憤怒的閱讀perldoc網站上的一些整潔的選項,然後回到我的mesosoic公司的Perl安裝,並發現確切的完美選項我發現需要一個助焊劑電容器,或者至少一個CPAN模塊升級 – DVK 2010-06-09 00:31:43

+1

您確定'pass_through'在5.8中不可用嗎?我剛剛爲5.6.1檢查了'perldoc Getopt :: Long'(你認爲你是史前的)),它就在那裏。 – Zaid 2010-06-09 08:31:54

1

不是簡單地在@ARGV留下剩餘的(未解析)值?如果你的額外內容與破折號開始,您將需要指出的選項列表的末尾有--

#!/usr/bin/perl 
use strict; 
use warnings; 
use Getopt::Long; 
use Data::Dumper; 

my $foo; 
my $result = GetOptions ("foo" => \$foo); 
print Dumper([ $foo, \@ARGV ]); 

然後美其名曰:

my_script.pl --foo -- --WHATEVER 

給出:

$VAR1 = [ 
      1, 
      [ 
      '--WHATEVER' 
      ] 
     ]; 

PS 。在MooseX::Getopt中,命令行中的「剩餘」選項作爲arrayref放入extra_argv屬性中 - 所以我建議轉換!

+0

他們是不是如果他們喜歡看的選項。相反,像「未知選項:WHATEVER」這樣的錯誤將發給STDERR。 – 2010-06-08 23:45:00

+0

@羅伯特:你的評論和我的編輯在乙醚中交叉:) – Ether 2010-06-08 23:46:24

+0

:]的確!哈哈,我也爲這個問題增加了一個這樣的例子。 – 2010-06-08 23:48:31

0

我認爲這裏的答案很遺憾是「不,沒有辦法像你問的那樣使用Getopt :: Long,而不用自己解析@ARGV」。不過,以太有一個體面的解決方法。就大多數人而言,這是一個功能,任何類似選項的參數都被視爲錯誤。通常,你可以做

GetOptions('foo' => \$foo) 
    or die "Whups, got options we don't recognize!"; 

捕獲/防止奇怪的選項被傳遞,然後你可以糾正用戶的使用情況。或者,您可以簡單地通過並忽略它們。