我不完全确定为什么我的if语句没有验证用户输入。这是我的代码。 包含正则表达式的语句应该允许前导和尾随空格。
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;
}
}
答案 0 :(得分: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 :(得分:0)
if($user_input =~ m/quit/){
exit;
}
同时chomp删除尾随\ n
所以:
elsif($user_input eq 'sortdown \n')
永远不会成真。