2014-04-01 72 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