2016-08-11 2 views
2

Мое требование - передать строку с + (например: ABC + DEF). И он должен соответствовать любому значению для actual_state, значения могут быть ABC+DEF ABC+DEF, ABC+DEF,, и т. Д. Там может быть одна или несколько запятых после ABC + DEF. Но это не должно совпадать с ABC+DEF, PQR-SL.Невозможно понять! ~ В regex

Ниже приведен фрагмент кода, что я пробовал:

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, если я буду проходить ABC+DEF. 0, если я буду проходить ABC+DEF, PQR-SL

почему я написал my $actual_state = 'ABC+DEF,'; Поскольку значения ABC+DEF ABC+DEF, ABC+DEF,, приходят как часть значения хэш-функции для определенного ключа, например. 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

У вас есть запятая , hardcoded в вашем $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 ,, поступают как часть хэш-значения для определенного ключа, например. 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

Смежные вопросы