首页 > 解决方案 > 如何在代码块中使 perl 正则表达式失败?

问题描述

我有一个我正试图用 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,它将打印“匹配”,这很好。

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

标签: perlpcre

解决方案


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

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

推荐阅读