2017-03-24 57 views
-1

我有一個查詢。我必須在一個條件中匹配2個字符串:不等式的Perl條件正則表達式

$ release = 5.x(這裏x應該大於或等於3) $ version = Rx(這個x應該大於或等於5 if $ release是5.3,否則任何東西都可以接受)

eg 5.1R11不可接受,5.3R4不可接受,5.3R5可接受,5.4可接受。

我寫這樣的代碼:

$release = "5.2"; 
$version = "R4"; 

if ($release =~ /5.(?>=3)(\d)/ && $version =~ m/R(?>=5)(\d)/) 
{ 
    print "OK"; 
} 

我怎麼可以這樣寫?

+1

在正則表達式''這意味着原子團 – mkHun

回答

3

這的確是一個三級版本字符串元素,我建議你使用Perl的version設施

use strict; 
use warnings 'all'; 
use feature 'say'; 
use version; 

my $release = '5.2'; 
my $version = 'R4'; 

if ($version =~ /R(\d+)/ && version->parse("$release.$1") ge v5.3.5) { 
    say 'OK'; 
} 
+2

你總是給新的東西更好的答案。這就是所謂的經驗:) – mkHun

+0

@Borodin非常感謝您的回答。但我不能使用任何其他模塊,因爲該腳本已被我的組織中的其他組使用。但是我的perl腳本知識真的有了一個新的工具。 –

+0

@prateekgoyal:你至少可以嘗試過! 'version' pragma自v5.10以來就是perl的一部分,所以你不需要安裝任何東西。它甚至可以按需加載,所以你不需要'use version'語句。 – Borodin

0

在正則表達式(?>)這意味着atomic grouping.

集團因此將存入$1然後用數比較$1所以應該

if ((($release =~ /5\.(\d)/) && ($1 > 3)) && (($version =~ m/R(\d)/) && ($1 >= 3))) 
{ 
    print "OK\n"; 
} 
+0

這不驗證'5.4'和'R1'正確 – Borodin

+0

@Borodin謝謝。發佈編輯。 – mkHun

+0

現在它不正確驗證'5.3'和'R5'! – Borodin

-1

我修改mkhun的解決方案後,正確的:(?>)

if ((($release =~ /5.3/)) && (($version =~ m/R(\d+)(.\d+)?/) && ($1 >= 5)) 
|| ((($release =~ /5.(\d)/) && ($1 > 3)) && ($version =~ m/R(\d+)(.\d+)?/))) 
{ 
    print "OK\n"; 
}