提问人:togarha 提问时间:4/1/2014 最后编辑:TLPtogarha 更新时间:4/2/2014 访问量:112
从命令行解析数字 argv
Parsing digits from command line argv
问:
我想更改执行循环次数的 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 参数的数字以用于循环限制。
提前致谢,如果有任何类似的问题,很抱歉,但我没有找到。
答:
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
-L
die
0赞
ikegami
4/2/2014
@Jonathan Leffler,因为我凭记忆操作,其中不包括.仍然需要,因为循环负数次非常困难!固定。i
die
下一个:C 预处理器宏替换
评论
$ARGV[$i] =~ m/^-L(\d+)$/