Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String perl中字符串变量的多重比较_String_Perl_Variables_Comparison - Fatal编程技术网

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

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阅读: 如果唯一允许的值是“一”或“二”,则可以编

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

阅读:

如果唯一允许的值是
“一”
“二”
,则可以编写:

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};