2014-01-19 26 views
0

我想在perl中创建我自己版本的Unix的cut命令。我想验证赋予-f选项的值。“cut -f values”通过regexp验证

下面是一个例子,怎么我的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]*))+,? 

但它返回true,如果用户键入例如:-2-5这是不正确的。

正确的例子:

-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- 

谁能帮我解决这个问题?

Regards

+0

你可以给出一个应该匹配的例子列表,以及另一个不应该...或者更好地解释什么是正确的结构应该是... – Enissay

+0

完成。使用-f选项,可以指定假定要分隔的字段列表。例如,如果指定-f 1,7,则cut命令只写出第一个和第七个字段。 (我已经从IBM复制并转换了定义) – Hladeo

+0

我发现['this'](http://publib.boulder.ibm.com/infocenter/aix/v6r1/index.jsp?topic=%2Fcom.ibm.aix .cmds%2Fdoc%2Faixcmds1%2Fcut.htm)手册页帮助了解其他人试图帮助的结构... – Enissay

回答

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和一个正则表达式,但同样的在我找到更好的工作后接管我的代码的可怜的同事必须支持这个混乱。在这里我指定参数可能被安排的每种可能的方式。如果存在错误,或者字段规格发生变化,则很容易找出代码。

+0

这是一个非常好的主意。谢谢! – Hladeo