ド・モルガンの法則を読んでください:
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")
常に真です。