2011-10-07 58 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