2010-03-16 67 views
2

我使用Getopt::Long解析Perl中的命令行選項。對於長命令(例如,--input=file),我不得不使用前綴-(一個短劃線)作爲短命令(-s)和--(雙短劃線)。如何使用Perl的Getopt :: Long處理-r = <pattern>?

我的問題是,有一個特殊的選項(-r=<pattern>),所以它是一個它的參數需要長期的選項,但它必須有一個破折號(-)前綴不是雙破折號(--)像其他長選項。是否可以設置Getopt::Long來接受這些?

+4

哎。它真的不能改變爲'-r arg'或'--r = arg'或者其他什麼?它不僅爲你工作,似乎讓用戶有一個打破常規習慣的選擇讓人感到困惑。 – Cascabel 2010-03-16 15:18:57

+0

P.S.我不是在試圖避免給你一個答案 - 我知道你可能已經意識到我說的了。 (另外我不認爲Getopt :: Long中有答案) – Cascabel 2010-03-16 15:30:12

+4

訣竅是讓參數看起來像人們對其他程序的期望。這是當你想要一個新的語法時,事情變得怪異,你必須做很多工作來解析它們。 – 2010-03-16 15:44:47

回答

3

您是否正在設置「捆綁」?

如果是這樣,您可以禁用綁定(但是,然後,您將無法執行諸如使用myprog -abc而不是myprog -a -b -c)。

否則,現在唯一想到的就是使用Argument Callback<>)並手動解析該選項。

6

默認情況下,Getopt::Long可互換地接受單( - )或雙短劃線( - )。所以,你可以使用--r=foo。當你嘗試時你有任何錯誤嗎?

use strict; 
use warnings; 
use Getopt::Long; 
my $input = 2; 
my $s = 0; 
my $r = 3; 
GetOptions(
    'input=s' => \$input, 
    's'  => \$s, 
    'r=s'  => \$r, 
); 
print "input=$input\n"; 
print "s=$s\n"; 
print "r=$r\n"; 

這些示例命令行產生相同的結果:

my_program.pl --r=5 
my_program.pl --r 5 
my_program.pl -r=5 
my_program.pl -r 5 

input=2 
s=0 
r=5 
0
#!/usr/bin/perl 

use strict; use warnings; 

use Getopt::Long; 

my $pattern; 

GetOptions('r=s' => \$pattern); 

print $pattern, "\n"; 

輸出:

C:\Temp> zz -r=/test/ 
/test/ 
C:\Temp> zz -r /test/ 
/test/

我缺少的東西?

+3

我認爲他所描述的可能是由於捆綁銷售? – DVK 2010-03-16 15:41:19

+0

@DVK情況可能如此。我沒有想到這一點。 – 2010-03-16 16:20:11