我想看看用户是否使用正确的字母在perl中,但它不工作的方式
chop($reply = <STDIN>);
if($reply ne "a" || $reply ne "b" || $reply ne "c" || $reply ne "d") {print " !!! ERROR !!!n";}
你的逻辑有缺陷。条件总是成立的,因为"a" ne "b"
总是成立的。不管你输入的是哪一个字母,其他的都会失败。
有几种方法可以重写这个条件。
最冗长的是使用逻辑和,而不是或。你想要这个条件:输入不是A,输入不是B,输入不是C,输入不是d
if ( $reply ne "a"
&& $reply ne "b"
&& $reply ne "c"
&& $reply ne "d" ) { ... }
如果你想让它不那么冗长,你可以使用模式匹配。这将测试字符串是否与模式不匹配,该模式恰好是字符组中给出的四个字母中的一个。该组也可以写入范围为[a-d]
。
if ( $reply !~ m/^[abcd]$/ ) { ... }
最后,如果有更多的选项或选项更复杂,您可以使用散列创建调度表。这要高级得多,但可以与子例程引用结合使用。高级Perl中有一章是关于它们的。
你用你想要允许的值作为键创建一个散列,然后你可以使用exists
来检查该值是否被允许。
my %allowed = (
a => 1,
b => 1,
c => 1,
d => 1,
);
if ( !exists $allowed{$reply} ) { ... }
如果您已经了解了正则表达式,那么您可能想要针对正则表达式进行测试:
chomp ($reply=<STDIN>);
if ($reply !~/^[a-d]$/) {print 'Error'}