如果有和/|| / && 在 perl 中

If with and / || / && in perl

我正在尝试查看用户是否在 perl 中使用了正确的字母,但这种方式行不通

chop($reply = <STDIN>);

if($reply ne "a" || $reply ne "b" || $reply ne "c" || $reply ne "d") {print " !!! ERROR !!!\n";}

如果您已经了解正则表达式,您可能想要测试它们:

chomp ($reply=<STDIN>);
if ($reply !~/^[a-d]$/) {print 'Error'} 

你的逻辑有问题。您的条件始终为真,因为 "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]$/ ) { ... }

最后,如果有更多选项或选项更复杂,您可以使用哈希进行调度 table。这要高级得多,但可以与子例程引用结合使用。 Higher Order Perl.

中有一章是关于他们的

您使用要允许的值创建一个散列作为键,然后您可以使用 exists 检查该值是否被允许。


my %allowed = ( 
  a => 1, 
  b => 1, 
  c => 1, 
  d => 1,
);

if ( !exists $allowed{$reply} ) { ... }