我正在尝试使用if运算符在perl中创建一些类似bash的case语句。
my $var = shift @ARGV;
print "err\n" if (!$var || ($var ne "one") || ($var ne "two"));
问题是,'if'语句不能按预期工作。例如,如果我输入'one'或'two'作为输入,则打印'err',但是,如果我将'ne'与'eq'交换,则脚本正常工作。
perl版本5.16.3 linux
答案 0 :(得分:2)
not($p && $q) == (!$p || !$q)
not($p || $q) == (!$p && !$q)
如果唯一允许的值为"one"
或"two"
,那么您可以写:
print "err\n"
unless defined $var
and $var eq "one" || $var eq "two";
如果您想使用ne
,那么:
print "err\n"
if ! defined $var
or $var ne "one" && $var ne "two";
这两种形式是等价的。如果您有两个以上的允许字符串,则使用哈希会更容易,更有效:
my %allowed;
@allowed{"one", "two"} = ();
print "err\n" unless defined $var and exists $allowed{$var};
您的代码存在的问题是:当将多个条件放在一起时,任何一个子条件都为真就足以使整个条件成立。
给定undef
或其他错误值,!$var
为真
给定字符串"one"
,$var ne "two"
为真
给定任何其他字符串,$var ne "one"
为真。
因此,($var ne "one") || ($var ne "two")
始终为真。