如何在代码块中使perl常规表达式失败?

时间:2018-11-16 18:41:02

标签: perl pcre

我想用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

如果文件中的版本大于9.1(7)23,它将打印“匹配”,这很好。

但是我希望正则表达式成功,而不仅仅是打印“ match”。如何将代码块中的内容转换为实际响应。我已经用*ACCEPT|*FAIL尝试了很多迭代,但是到目前为止没有任何效果。

1 个答案:

答案 0 :(得分:4)

首先,正则表达式确实成功。但是,无论条件是否成立,它都会这样做。我认为您实际上是在条件为假时要求它失败。为此,您想要

(?(?{ 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