0

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

4

1 回答 1

2

阅读德摩根的法律

not($p && $q) == (!$p || !$q)
not($p || $q) == (!$p && !$q)

如果唯一允许的值是"one"or "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"为真。
给定任何其他字符串,the$var ne "one"为真。

因此,($var ne "one") || ($var ne "two")总是如此。

于 2013-07-31T18:51:25.983 回答