在正则表达式中无法理解!〜

时间:2016-08-11 07:38:51

标签: regex perl

我的要求是传递带+的字符串(例如:ABC + DEF)。并且它应该与actual_state的任何值匹配,值可以是ABC+DEF ABC+DEF, ABC+DEF,,等。在ABC + DEF之后可以有一个或多个逗号。但它不应与ABC+DEF, PQR-SL匹配。

以下是我尝试过的代码段:

sub verify_state{
     my $expected_state = shift;
     my $vol            = 'vol';
     my $actual_state   = 'ABC+DEF,';
     print "Verify backend state for $vol\n";
     print "Expected backend state for $vol = $expected_state\n";
     print "Actual backend state for $vol = $actual_state\n";
     if ( $expected_state !~ /$actual_state,*$/ ) {
         print
             "Expected state was $expected_state but got $actual_state for $vol\n"
         ;
         return 0;
     }
     return 1;
 }

 my $val = verify_state('ABC+DEF');
 print $val,"\n";
如果我通过ABC+DEF,它应该给我1。 0如果我将通过ABC+DEF, PQR-SL

为什么我写my $actual_state = 'ABC+DEF,'; 因为值ABC+DEF ABC+DEF, ABC+DEF,,是特定键的哈希值的一部分,例如。 my $actual_state = $status->{state};

2 个答案:

答案 0 :(得分:4)

您的,中有一个逗号$actual_state硬编码。因此它无法匹配您正在测试的输入,ABC+DEF没有逗号。您构建模式的方式还需要转义+(感谢slebetman),所以

my $actual_state = 'ABC\+DEF';

并且发布的代码在我的测试中有效。

这假设您的输入必须以该字符串结尾,并且可选地仅使用逗号。

答案 1 :(得分:3)

  

为什么我写了$ actual_state ='ABC + DEF';因为价值观   ABC + DEF ABC + DEF,ABC + DEF ,,作为哈希值的一部分出现   对于特定的密钥,例如。我的$ actual_state = $ status-> {state};

如果是这种情况,那么您可以从Prevent中删除尾随逗号,或者在模式匹配中忽略它们。

也使用quotemeta。请参阅下面的示例以获得一个想法。

$actual_state