首页 > 解决方案 > 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。)

该代码似乎是有效的:

显然,我没有完全掌握 Perl 运算符。我究竟做错了什么?

谢谢 !

标签: perlif-statementoperatorsconditional-statements

解决方案


if ( ($new_status ne "active") || ($new_status ne "inactive") )
{
  die "Status must be active/inactive.";
}

让我们梳理一下逻辑。

  1. 我随机输入一些东西(让我们使用random)。random不是“活动的”,也不是“不活动的”,所以你的if条款变成if (true or true)了 - 这是真的。
  2. 我打字active。第一次检查是假的,第二次检查是真的,所以你得到if (false or true)- 这是真的。
  3. 我打字inactive。第一次检查是真的,第二次检查是假的,所以你得到if (true or false)- 这是真的。

您可以输入的任何内容都不会使您的if陈述成为错误。

您不想将两个子句与 连接的问题or,您应该and改用。

(并从这位老程序员那里得到一个提示 - 使用andandor代替&&and||来进行流控制会更容易混淆。)

更新:总而言之,您的代码中有太多负面因素,您自己也感到困惑。在您的回答中,您(默默地!)将 更改ifunless,从而使维护程序员更难遵循代码。

我会这样写:

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

推荐阅读