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"またはのみの場合、次の"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";

これら 2 つの形式は同等です。許可された文字列が 3 つ以上ある場合は、ハッシュを使用することで、はるかに簡単かつ効率的になります。

my %allowed;
@allowed{"one", "two"} = ();

print "err\n" unless defined $var and exists $allowed{$var};

コードの問題は次のとおりです。複数の条件を一緒に論理和する場合、条件全体が真になるには、いずれかのサブ条件が真になるだけで十分です。

またはその他の偽undefの値を指定する!$varと、真になります。
文字列 が与えられた場合"one"、これ$var ne "two"は真です。
他の文字列が与えられた場合、これ$var ne "one"は true です。

したがって、($var ne "one") || ($var ne "two")常に真です。

于 2013-07-31T18:51:25.983 に答える