【问题标题】:Multiple comparison of string variable in perlPerl中字符串变量的多重比较
【发布时间】:2013-08-01 10:32:42
【问题描述】:

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

【问题讨论】:

  • 您能否说明预期的行为是什么?除了onetwo 是否允许所有真值?还是只允许onetwo
  • 只有在没有定义参数或者不是“一”或“二”时,代码才必须返回“错误”。否则根本没有输出。

标签: string perl variables comparison


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2018-09-23
    • 2021-10-14
    • 1970-01-01
    • 2012-12-12
    • 2020-03-23
    相关资源
    最近更新 更多