2011-10-07 112 views
2

我想比較一個變量和正則表達式中的另一個變量。如果變量的內容完全相同,匹配會很好,但如果值的順序不同,我希望匹配發生。Perl的正則表達式匹配忽略順序

例子:

#!/usr/bin/perl 

my $output = "test0 test1"; 
my $expected_output = "test1 test0"; 
my $expected_regex = qr/^$expected_output\s*$/; 
print "Expected_regex :: $expected_regex\n"; 
if ($output =~ $expected_regex) { 
    print "pass\n"; 
} 

在我的例子,我能做些什麼來讓$output = $expected_regex即使它們包含相同的值,但不會以相同的順序?

+1

如果您的輸入模式不像您在此處所述的那樣「簡單」,請編輯您的問題(短但具有代表性)的「真實生活」示例,以便我們更好地瞭解您正在嘗試執行的操作。 – Mat

回答

4

假設您的輸入是真正的「簡單」,即用空格隔開的話,你可以這樣做:

#! /usr/bin/perl -w 
use strict; 
use warnings; 

my $output = "test0 test1"; 
my $expected_output = "test1 test0"; 

# Store the sorted pieces of each string in a list 
my @o = sort(split(/ /, $output)); 
my @e = sort(split(/ /, $expected_output)); 

# Compare both arrays for equality of each member 
print "pass\n" if (@o ~~ @e); 

的滑稽~~操作請參見smart matching in detail

如果您的輸入不那麼簡單,則可能會詳細說明拆分中的/ /,或者可以推導出類似的技術。

如果沒有,只要保留前兩行並將其放入所有不平凡的腳本中即可。這一定會對你有所幫助。

+0

有時,這不是關於用你拿起的工具做事,而是讓你知道更適合你工作的工具。 –

+0

爲什麼在'使用警告'時使用'-w'?不是'-w'棄用? – Qtax

+0

Humm ...我猜是壞習慣。我甚至沒有注意到它: - /我沒有看到任何關於它在man perl中被棄用的東西(但實際上它是多餘的)。儘管如此,_BUGS_部分仍然存在'-w開關是可選的');) – Mat