if ( ($new_status ne "active") || ($new_status ne "inactive") )
{
die "Status must be active/inactive.";
}
Давайте проработаем логику.
- Я набираю что-то случайное (давайте используем
random
).random
не является "активным" и не "неактивным", поэтому ваше предложение if
становится if (true or true)
- это правда. - Я печатаю
active
.Это ложно при первой проверке и верно при второй проверке, поэтому вы получите if (false or true)
- что верно. - Я печатаю
inactive
.Это верно для первой проверки и ложно для второй, так что вы получите if (true or false)
- что верно.
Вы не можете ввести ничего, что сделает ваше утверждение if
ложным.
Ваша проблема в том, что вы не хотите объединять свои два предложения с or
, вместо этого вы должны использовать and
.
(И взять совет от этого старого программиста - используя and
иor
вместо &&
и ||
для управления потоком будет гораздо менее запутанным.)
Обновление: В общем, в вашем коде слишком много негативов, и выпутаешь себяВ своем ответе вы (молча!) Изменили if
на unless
, тем самым усложнив код для программиста по техническому обслуживанию.
Я бы написал так:
my $valid = $new_status eq 'active' || $new_status eq 'inactive';
if (not $valid) {
die "...";
}
Или вот так:
use List::Util 'any';
if (not any { $new_status eq $_ } qw[active inactive] ) {
die "...";
}