2014-01-19 2 views
0

Я пытаюсь создать в perl свою собственную версию команды вырезания Unix. Я хотел бы проверить значения, заданные параметру -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- 

Может кто-нибудь помочь мне решить эту проблему проблема?

С уважением

+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

Смежные вопросы