Как сделать так, чтобы регулярное выражение perl не сработало в блоке кода? - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть винт, который я пытаюсь прибить с помощью Perl, и до сих пор это то, что у меня есть.

perl -ne '/(.+)\.(.+)\((.+)\)(.+)(?{print "match" if  ( $1 > 9 || ( $1 == 9 && $2 > 1 ) || ($1 == 9 && $2 == 1 && $3 > 7 ) || $1 == 9 && $2 == 1 && $3 == 7 && $4 > 22 ) })/' versions

версии:

9.1(7)23
9.1(7)22
8.1(7)22
7.2(33)24
55

он напечатает «match», если версия в файле> 9,1 (7) 23, что хорошо.

Но я хочу, чтобы регулярное выражение выполнялось успешно, а не просто печатало "match".Как мне перевести материал внутри блока кода в реальный ответ.Я пробовал довольно много итераций с *ACCEPT|*FAIL, но пока ничего не получалось.

1 Ответ

0 голосов
/ 16 ноября 2018

Прежде всего, регулярное выражение действительно успешно.Но это так, является ли условие истинным или нет.Я думаю, что вы на самом деле просите об этом fail , когда условие ложно.Для этого вам нужно

(?(?{ condition })(*ACCEPT)|(*FAIL))

или просто

(?(?{ !condition })(*FAIL))

Исправлено:

perl -nle'
   print "$_: match"
      if /
         ^(.+)\.(.+)\((.+)\)(.+)\z
         (?(?{
            !( $1 > 9
            || $1 == 9 && $2 > 1
            || $1 == 9 && $2 == 1 && $3 > 7
            || $1 == 9 && $2 == 1 && $3 == 7 && $4 > 22
            )
         })(*FAIL))
      /x;
' versions

Гораздо лучший подход - выполнить проверку вне шаблона.

perl -nle'
   print "$_: match"
      if /^(.+)\.(.+)\((.+)\)(.+)\z/
      && (
            $1 > 9
         || $1 == 9 && $2 > 1
         || $1 == 9 && $2 == 1 && $3 > 7
         || $1 == 9 && $2 == 1 && $3 == 7 && $4 > 22
      );
' versions
...