我正在尝试通过仅使用 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
我正在尝试通过仅使用 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
阅读德摩根的法律:
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")
总是如此。