Perl 中多个模式的字符串匹配

vin*_*k89 3 perl if-statement string-matching

我有一个字符串,当我用变量检查它时,它没有给我预期的结果。通过使用模式匹配机制,它工作正常。

这是 Perl 中的预期行为吗?如果没有,如何在不使用模式匹配的情况下解决此问题。

代码如下:

#!/usr/bin/perl

use strict; 
use warnings;

my $day_of_week = "Monday";

if (($day_of_week ne "Monday") or ($day_of_week ne "Tuesday")){
    print "In If. Today is $day_of_week.\n";
} else {
    print "In else part\n";
}
Run Code Online (Sandbox Code Playgroud)

这应该给出输出:

In else part
Run Code Online (Sandbox Code Playgroud)

但它给了我:

In If. Today is Monday.
Run Code Online (Sandbox Code Playgroud)

当我if使用如下模式匹配更改条件时,它工作正常。

if ($day_of_week !~ /Monday|Tuesday) {
Run Code Online (Sandbox Code Playgroud)

我担心的是为什么字符串匹配不能按条件工作。我在这里做错了什么。

zdi*_*dim 6

是复杂的复合条件让你——

$day_of_week ne "Monday"  # FALSE but 
$day_of_week ne "Tuesday" # TRUE
Run Code Online (Sandbox Code Playgroud)

所以你在测试

if (FALSE or TRUE)  #--> true
Run Code Online (Sandbox Code Playgroud)

这就是为什么建议尝试始终“纠正”这些条件的原因。

所以为了测试它既不是星期一也不是星期二

if ( $day_of_week ne "Monday" and $day_of_week ne "Tuesday" )
Run Code Online (Sandbox Code Playgroud)

这更难混淆。


您可能想要的逻辑需要编码为

if (not ($day_of_week eq "Monday" or $day_of_week eq "Tuesday") )
Run Code Online (Sandbox Code Playgroud)

形成一个然后被否定的大型复合条件通常比替代方案更清晰,但在我看来,在这种情况下并非如此。