我正在尝试在perl中创建我自己的Unix剪切命令版本。我想验证给予-f选项的值。
这是一个例子,我的perl脚本应该如何正确执行:
perl mycut -f -47,49,53,56-60,71-
我想验证这些数字,由用户输入。我尝试过类似的东西:
(([1-9]+[0-9]*[-][1-9]+[0-9]*)|([1-9]+[0-9]*[-]+)|([-]?[1-9]+[0-9]*))+,?
但如果用户输入例如:-2-5不正确,则返回true。
正确的例子:
-7,10,21,23-33,39-80,99,116-120
21-25,32,33,41
1,2,4,5-
7
不像上面这么“好”,但我可以处理它们:
32,17,-4,15,22-
-7,14-,15,2,6,18-
11,81,65-69,18,2,81
不正确的:
0
1,2,3,4,-5-6
-1-2,0,2,17-18
-25,28,-29-30,32
0,1,2,3,4,5
0-1,2-3
-2-7,9,11-
有人可以帮我解决这个问题吗?
此致
答案 0 :(得分:4)
你试图用正则表达式做太多的事情。即使你让它发挥作用,那些必须支持它的人是否会理解它?
如果您使用split
拆分每个字段规范,然后分别检查每个字段规范,那么您最好:
my @fields = split /,/, $field_parameter; # Split -f param on commas
for my $field ( @fields ) {
if ( not $field =~ /^\d+-\d+$/ # 1-3
and not $field =~ /^\d+$/ # 3
and not $field =~ /^-\d+$/ # -3
and not $field =~ /^\d+-$/ # 3-
) {
die qq(Invalid field specification "$field".);
}
}
我本可以指定一个if
和一个正则表达式,但是在我找到更好的工作后接管我的代码的可怜的同事必须支持这个混乱。在这里,我指定参数可以安排的每种可能方式。如果存在错误,或者字段规格发生变化,则很容易找出代码。