Perl 中针对多个模式的字符串匹配
String matching in Perl for multiple patterns
我有一个字符串,当我用变量检查它时,它没有给我预期的结果。通过使用模式匹配机制,它工作正常。
这是 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";
}
这应该给出输出:
In else part
但它给了我:
In If. Today is Monday.
当我使用如下模式匹配更改 if
条件时,它工作正常。
if ($day_of_week !~ /Monday|Tuesday) {
我担心的是为什么字符串匹配不符合条件。我是不是做错了什么。
这是复杂的复合条件让你 --
$day_of_week ne "Monday" # FALSE but
$day_of_week ne "Tuesday" # TRUE
所以你正在测试
if (FALSE or TRUE) #--> true
这就是为什么建议始终尝试“矫正”这些情况的原因。
所以要测试它既不是星期一也不是星期二
if ( $day_of_week ne "Monday" and $day_of_week ne "Tuesday" )
这更不容易混淆。
您可能想要的逻辑需要编码为
if (not ($day_of_week eq "Monday" or $day_of_week eq "Tuesday") )
形成一个然后被否定的大复合条件通常比替代方案更清晰,但我认为在这种情况下并非如此。
以下总是正确的:
it isn't Monday, OR it isn't Tuesday
- 星期一不是星期二,所以是真的(
F OR T = T
)
- 周二不是周一,所以是真的(
T OR F = T
)
- 星期三,两者都不是 (
T OR T = T
)
你想要
it isn't Monday, AND it isn't Tuesday
if ($day_of_week ne "Monday" && $day_of_week ne "Tuesday") {
print "Today is $day_of_week.\n";
} else {
print "Otherwise\n";
}
或
if ($day_of_week eq "Monday" || $day_of_week eq "Tuesday") {
print "Otherwise\n";
} else {
print "Today is $day_of_week.\n";
}
When I change the if condtion with pattern matching like below, it works fine.
那是因为
it isn't Monday or Tuesday
与
不同
it isn't Monday, or it isn't Tuesday
我们可以证明这一点。
$day_of_week !~ /Monday|Tuesday/
等同于
!( $day_of_week =~ /Monday|Tuesday/ )
相当于
!( $day_of_week =~ /Monday/ || $day_of_week =~ /Tuesday/ )
相当于
!( $day_of_week =~ /Monday/ ) && !( $day_of_week =~ /Tuesday/ )
(根据 De Morgan's law)
相当于
$day_of_week !~ /Monday/ && $day_of_week !~ /Tuesday/
请注意如何使用 AND,但您使用的是 OR。
我有一个字符串,当我用变量检查它时,它没有给我预期的结果。通过使用模式匹配机制,它工作正常。
这是 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";
}
这应该给出输出:
In else part
但它给了我:
In If. Today is Monday.
当我使用如下模式匹配更改 if
条件时,它工作正常。
if ($day_of_week !~ /Monday|Tuesday) {
我担心的是为什么字符串匹配不符合条件。我是不是做错了什么。
这是复杂的复合条件让你 --
$day_of_week ne "Monday" # FALSE but
$day_of_week ne "Tuesday" # TRUE
所以你正在测试
if (FALSE or TRUE) #--> true
这就是为什么建议始终尝试“矫正”这些情况的原因。
所以要测试它既不是星期一也不是星期二
if ( $day_of_week ne "Monday" and $day_of_week ne "Tuesday" )
这更不容易混淆。
您可能想要的逻辑需要编码为
if (not ($day_of_week eq "Monday" or $day_of_week eq "Tuesday") )
形成一个然后被否定的大复合条件通常比替代方案更清晰,但我认为在这种情况下并非如此。
以下总是正确的:
it isn't Monday, OR it isn't Tuesday
- 星期一不是星期二,所以是真的(
F OR T = T
) - 周二不是周一,所以是真的(
T OR F = T
) - 星期三,两者都不是 (
T OR T = T
)
你想要
it isn't Monday, AND it isn't Tuesday
if ($day_of_week ne "Monday" && $day_of_week ne "Tuesday") {
print "Today is $day_of_week.\n";
} else {
print "Otherwise\n";
}
或
if ($day_of_week eq "Monday" || $day_of_week eq "Tuesday") {
print "Otherwise\n";
} else {
print "Today is $day_of_week.\n";
}
When I change the if condtion with pattern matching like below, it works fine.
那是因为
it isn't Monday or Tuesday
与
不同it isn't Monday, or it isn't Tuesday
我们可以证明这一点。
$day_of_week !~ /Monday|Tuesday/
等同于
!( $day_of_week =~ /Monday|Tuesday/ )
相当于
!( $day_of_week =~ /Monday/ || $day_of_week =~ /Tuesday/ )
相当于
!( $day_of_week =~ /Monday/ ) && !( $day_of_week =~ /Tuesday/ )
(根据 De Morgan's law)
相当于
$day_of_week !~ /Monday/ && $day_of_week !~ /Tuesday/
请注意如何使用 AND,但您使用的是 OR。