String perl中字符串变量的多重比较
我正在尝试使用only if操作符在perl中生成某种类似bash的case语句String perl中字符串变量的多重比较,string,perl,variables,comparison,String,Perl,Variables,Comparison,我正在尝试使用only 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阅读: 如果唯一允许的值是“一”或“二”,则可以编
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阅读:
如果唯一允许的值是“一”
或“二”
,则可以编写:
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”)
总是正确的。您能否弄清楚预期的行为是什么?除了1
和2
之外,是否允许所有真值?或者只允许one
或two
吗?只有在参数未定义或不是“one”或“two”时,代码才能返回“err”。否则根本就没有输出。
my %allowed;
@allowed{"one", "two"} = ();
print "err\n" unless defined $var and exists $allowed{$var};