perl中字符串变量的多重比较

时间:2013-07-31 18:33:05

标签: string perl variables comparison

我正在尝试使用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

1 个答案:

答案 0 :(得分:2)

阅读De Morgan’s laws

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")始终为真。