2014-04-01 48 views
1

我想更改執行循環的perl腳本,並且我想通過命令行選項傳遞循環數。該程序現在收到一些選項,然後我需要將其更改爲接收新參數,但這是我第一次看到perl腳本,然後我不知道如何更改。 程序的開始(解析命令行選項)是:從命令行解析數字argv

if ($#ARGV >= 1) { 
    for ($i = 1; $i <= $#ARGV; $i++) { 
     if ($ARGV[$i] =~ /^\-/) { 
      if ($ARGV[$i] =~ /\-test/) { 
       //do something 
      } 
     } else { 
      //do something other 
     } 
    } 
} 

我認爲我必須把這樣的:

if ($ARGV[$i] =~ /^\-L40/) 

但它只能匹配到40,我不知道如何解析附加到-L參數的數字以用於循環限制。

在此先感謝並對不起,如果有任何類似的問題,但我沒有找到任何。

+6

你需要某種getopt的圖書館。例如:http://perldoc.perl.org/Getopt/Long.html –

+0

不要自己解析選項。使用核心Getopt :: Long模塊。 –

+1

如果你堅持這種方法,使用'$ ARGV [$ i] =〜m/^ - L(\ d +)$ /',但是如果使用Getopt :: Std或Getopt :: Long,兩個標準模塊; CPAN中的Getopt可能有40個其他變體)。 –

回答

1

喜歡的東西:

my $loopLimit = 1; # default 

if ($#ARGV >= 1) 
{ 
    for ($i = 1; $i <= $#ARGV; $i++) 
    { 
    if ($ARGV[$i] =~ /^\-/) 
    { 
     if ($ARGV[$i] =~ /\-test/) 
     { 
      # do something 
     } 
     elsif ($ARGV[$i] =~ /\-L(\d+)/) # -L followed by digits 
     { 
      $loopLimit = $1; 
     } 
    } 
    else 
    { 
     # do something other 
    } 
    } 
} 
+0

如果有人使用腳本像'/ path/to/script -L 17'那樣運行它(標誌和值之間有空格)會怎麼樣? – ThisSuitIsBlackNot

+0

只是解釋給出的問題,所以OP知道需要什麼工作。我完全同意使用其中一個CPAN模塊是更好的舉措。 –

+0

這就是我正在尋找的東西,我認爲最好使用GetOptions,但我想盡可能少地從現有程序中進行更改... – togarha

4
use Getopt::Long qw(); 

sub usage { 
    print(STDERR "usage: prog [--test] [-L NUM]\n"); 
    exit(1); 
}  

GetOptions(
    'test' => \my $opt_test, 
    'L=i' => \my $opt_L, 
) 
    or usage(); 

die("-L must be followed by a positive integer\n") 
    if defined($opt_L) && $opt_L < 1; 
+0

是否有一個不使用'L = i'的理由Getopt :: Long需要'-L'選項後面的數字嗎?那麼你不需要「死亡」。 –

+0

@Jonathan Leffler,因爲我是從記憶中操作的,裏面沒有包括'i'。由於循環負數是非常困難的,因此仍然需要「死亡」。固定。 – ikegami