perl - Perl 字符串 if/或比较运算符
问题描述
为什么是下面的代码:
# Get new_status
print STDERR "Please enter status value (active/inactive): ";
ReadMode(1);
my $new_status = ReadLine(0);
ReadMode(0);
print STDERR "\n";
if ( ($new_status ne "active") || ($new_status ne "inactive") )
{
die "Status must be active/inactive.";
}
将始终返回“状态必须处于活动/非活动状态。” 不管我输入什么?(活动、非活动或其他任何内容,甚至只需按 Enter。)
该代码似乎是有效的:
- 我清楚地将两个语句用括号分开
- 在这两种情况下我都使用字符串运算符“ne”
- 我使用 OR 运算符 ||
显然,我没有完全掌握 Perl 运算符。我究竟做错了什么?
谢谢 !
解决方案
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
andor
代替&&
and||
来进行流控制会更容易混淆。)
更新:总而言之,您的代码中有太多负面因素,您自己也感到困惑。在您的回答中,您(默默地!)将 更改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 "...";
}
推荐阅读
- html - 以响应方式在图像上显示按钮,而不在图像下方放置大量空间
- sql - 获取书名、客户姓名并显示未订购书名的 SQL 语句
- c++ - 为什么在这些折叠表达式中使用 std::min 是未定义的行为?
- python - 从许多 txt 文件创建许多 df
- reactjs - DeckGL:拖动元素时防止地图移动
- c++ - 迭代插入 std::list 然后转换为 std::vector 以进行随机访问?
- excel-formula - Excel 的公式注释使用 +N("...")
- c - 验证 argv 1 是否具有确定的值
- flutter - Flutter - 将文本粘贴到已经写在 TextField 中的其他文本上
- php - _once 在文件操作中的真正含义是什么?