2016-08-11 8 views
2

私の要件は、+(たとえば:ABC + DEF)の文字列を渡すことです。 actual_stateの値と一致する必要があります。値はABC+DEF ABC+DEF, ABC+DEF,,などです。ABC + DEFの後にカンマが1つ以上あることがあります。しかし、それは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 ABC+DEF, ABC+DEF,,は、特定のキーなどのハッシュ値の一部として来ているので、私はmy $actual_state = 'ABC+DEF,'; を書いたなぜ私はABC+DEF, PQR-SL

に合格するかどうか。 my $actual_state = $status->{state};

+2

あなたの説明はあまり明確ではありません。あなたは質問を編集して、あなたが入れた文字列ごとに期待される出力のリストを作成できますか?あなたのパターンが間違っているように聞こえますが、私はあなたがしようとしていることを理解していません。 – simbabque

+0

'!〜'は*が一致しないことを意味します*(単に '=〜'と論理的に反対です) – rustyx

+0

@simbabque、私の場合はactual_stateはABC + DEF ABC + DEF、ABC + DEF私はそれを支配していませんが、私が渡しているものはここでは一定です。つまり、ABC + DEFです。私は否定的にABC + DEFとactual_stateとそこにあるものとを一致させようとしています。私は、ABC + DEF!〜ABC + DEFまたはABC + DEF!〜ABC + DEF、またはABC + DEF!〜ABC + DEF ,,を意味します。すべての場合、それは偽であり、1を返すべきです。 – Satya

答えて

4

$actual_stateには、コンマ,がハードコードされています。したがって、あなたがテストしている入力と一致することはできません。ABC+DEFカンマなし。あなたはまた、+slebetmanのおかげで)エスケープする必要があるパターンを構築する方法は、そう

my $actual_state = 'ABC\+DEF'; 

と投稿のコードでは、私のテストで動作します。

これは入力が実際にその文字列で終わらなければならないことを前提としています。

+1

彼はまた '+'からエスケープする必要があります。現在、これは 'ABCCCDEF'と一致しますが、' ABC + DEF'とは一致しません。 – slebetman

+0

@slebetmanああ、ありがとう!修正されました。 – zdim

+0

+をスキップしてカンマを削除しても問題なく動作します。ありがとう、@slebetman – Satya

3

なぜ私は$ actual_state = 'ABC + DEF'を書きました。値 ABC + DEF ABC + DEF、ABC + DEF ,,が特定のキーのためのハッシュ値 の一部として来ているためです。私の$ actual_state = $状態 - > {状態}; 。

この場合、末尾のカンマを$actual_stateから削除するか、パターンマッチングで無視してください。

quotemetaも使用してください。アイデアを得るには、下記の例を参照してください。

#!/usr/bin/perl 
use strict; 
use warnings; 
my $expected = qr{ABC+DEF}; 
my $actual_state = qr{ABC+DEF}; 
#my $actual_state = qr{ABC+DEF,}; 
#my $actual_state = qr{ABC+DEF,,}; 
#if $actual_state has comma then you can do search and replace 
$actual_state =~ s/,//g; 
print "Matched" if $expected =~ /\Q$actual_state\E/; 
#prints "Matched" 
+1

が**、**に変更され、+ quotemeta **を使用して+をスキップしました。ありがとうございました – Satya

関連する問題