从命令行解析数字 argv

Parsing digits from command line argv

提问人:togarha 提问时间:4/1/2014 最后编辑:TLPtogarha 更新时间:4/2/2014 访问量:112

问:

我想更改执行循环次数的 perl 脚本,并且我想通过命令行选项传递循环数。程序现在收到一些选项,然后我需要更改它以接收新参数,但这是我第一次看到perl脚本,然后我不知道如何更改。 程序的开始(解析命令行选项)是:

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 参数的数字以用于循环限制。

提前致谢,如果有任何类似的问题,很抱歉,但我没有找到。

正则表达式 Perl

评论

6赞 Lajos Veres 4/1/2014
您需要某种 GetOpt 库。例如:perldoc.perl.org/Getopt/Long.html
0赞 Andy Lester 4/1/2014
不要自己解析选项。使用核心 Getopt::Long 模块。
1赞 Jonathan Leffler 4/1/2014
如果您坚持这种方法,请使用这种方法,但使用 Getopt::Std 或 Getopt::Long 会更好(仅举两个标准模块;CPAN 中 Getopt 上可能还有其他 40 个变体)。$ARGV[$i] =~ m/^-L(\d+)$/

答:

1赞 Paul Roub 4/1/2014 #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赞 ThisSuitIsBlackNot 4/1/2014
如果有人使用脚本运行它(标志和值之间有一个空格)怎么办?/path/to/script -L 17
0赞 Paul Roub 4/1/2014
只是按照给定的方式解释问题,因此 OP 了解它需要什么才能工作。我完全同意使用其中一个 CPAN 模块是更好的选择。
0赞 togarha 4/1/2014
这正是我一直在寻找的,我读到使用 GetOptions 更好,但我想尽可能少地更改现有程序......
0赞 ikegami 4/1/2014
然后你还有很多很多代码要写。例如,这不会因为 that doesn't handle 而给出错误-L12D
0赞 togarha 4/1/2014
现在没有真正的问题,我可以接受这个问题
4赞 ikegami 4/1/2014 #2
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赞 Jonathan Leffler 4/1/2014
有没有理由不使用 Getopt::Long 在选项后需要一个数字?那么你就不需要 .L=i-Ldie
0赞 ikegami 4/2/2014
@Jonathan Leffler,因为我凭记忆操作,其中不包括.仍然需要,因为循环负数次非常困难!固定。idie