perl - 如何在代码块中使 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
但到目前为止没有任何效果。
解决方案
首先,正则表达式确实成功了。但无论条件是否为真,它都会这样做。我认为您实际上是在条件为假时要求它失败。为此,你想要
(?(?{ 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
推荐阅读
- c# - C# 替换前导撇号 Excel COM
- ruby - 仅将对象 ID 或整个对象传递给方法
- python - Using both leaf and stem images for plant disease detection using convolution neural network?
- json - 如何将空 JSON 值设置为 JMeter 变量
- javascript - 带有 sql 的 EventSources 在 Fullcalendar 中不起作用
- java - 在 Java 控制台中显示分隔数据
- swift - 如何在 Swift 中找到运算符定义?
- android - 如果它们之间有一个活动,我想通过意图发送选定的数据
- geospatial - GraphDB 8.6.1 Free - 地理空间谓词不适用于运行时,但适用于 Workbench
- delphi - TIDHTTP:无法在非 https URL 上加载 SSL 库