2016-08-11 4 views
2

내 요구 사항은 + (예 : ABC + DEF)와 문자열을 전달하는 것입니다. 그리고 그것은 actual_state에 대한 어떤 값과도 일치해야합니다. 값은 ABC+DEF ABC+DEF, ABC+DEF,, 등이 될 수 있습니다. ABC + DEF 뒤에 하나 이상의 쉼표가있을 수 있습니다. 하지만 ABC+DEF, PQR-SL과 일치해서는 안됩니다.! ~ 정규식에서 이해할 수 없습니다

아래 코드는 내가 뭘하려 니펫을 : 내가 ABC+DEF를 통과 할 경우

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"; 

은이 날 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 쉼표없이 입력하십시오. 그래서

my $actual_state = 'ABC\+DEF'; 

당신은 또한 + (slebetman 덕분에) 탈출하는 데 필요한 패턴을 구축하는 방법, 및 게시 된 코드 내 테스트에서 작동합니다.

입력 내용이 실제로 해당 문자열로 끝나야하며, 선택적으로 쉼표로 끝나야한다는 것을 전제로합니다.

+1

그는 또한 '+'를 이스케이프 처리해야합니다. 현재 이것은 'ABCCCDEF'와 일치하지만 ABC + DEF는 일치하지 않습니다. – slebetman

+0

@slebetman 아, 네 - 감사합니다! 수정 됨. – zdim

+0

을 건너 뛰고 쉼표를 제거한 후에 정상적으로 작동합니다. 고마워요. @slebetman – Satya

3

내가 $ actual_state = 'ABC + DEF'를 쓴 이유; 값 ABC + DEF ABC + DEF, ABC + DEF ,,가 특정 키에 대한 해시 값 의 일부로오고 있기 때문에 예. my $ actual_state = $ status -> {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

관련 문제