2013-04-29 3 views
0

Я не совсем уверен, почему мои операторы if не проверяют ввод пользователя. Вот мой код. Операторы, содержащие регулярные выражения, должны допускать ведение и завершение пробелов.Perl if-statements/regular expressions

sub  Menu 
{ 

    &processlist; 
    &creating_Refs; 

    print "[Sort by COLUMN|sortup|sortdown| quit]:"; 
    my $user_input = <STDIN>; 
    chomp($user_input); 

    if($user_input =~ m/[quit\s]/) 
    { 
      exit; 
    } 
    elsif($user_input eq 'sortup') 
    { 
      print "working bro\n\n"; 
      @$VAR1 = sort sortup @$VAR1; 

      foreach my $ref (@$VAR1) 
      { 
        print "$ref->{PID}, $ref->{USER}, $ref->{PR}, $ref->{NI}, $ref->{VIRT}, $ref->{RES}, $ref->{SHR}, $ref->{S}, $ref->{CPU}, $ref->{MEM}, $ref->{TIME}, $ref->{COMMAND} \n"; 
      } 
    } 
    elsif($user_input eq 'sortdown \n') 
    { 
      print "working on sortdown\n\n"; 

    } 
    elsif($user_input =~ m/[sort by]+\w/) 
    { 


    } 
    else 
    { 
      print "Error, please re-enter command \n\n"; 
      &Menu; 
    } 

}

ответ

4

Класс символов как [abcd] позволяет любому один из символов, указанных в квадратных скобках. Когда вы говорите [sort by], это эквивалентно /s|o|r|t| |b|y/, который будет соответствовать любому из этих символов, только один раз. Если вы хотите совместить sort by, используйте /sort by/.

А в вашем случае:

if($user_input =~ m/quit/){ 
    exit; 
} 

и точное совпадение слова использовать границы слова:

if($user_input =~ m/\bquit\b/){ 
    exit; 
} 
+1

После замены всех моих операторов if на тот же синтаксис 'if $ user_input eq 'whatever'' Все работает. Спасибо, сэр. – 2013-04-29 01:08:30

+0

Это также соответствует 'quitter' и т. Д. – ikegami

0
if($user_input =~ m/quit/){ 
    exit; 
} 

Также грызть удаляет конечные \ п

Итак:

elsif($user_input eq 'sortdown \n') 

Никогда не будет правдой.