首页 > 解决方案 > 发现这是一个旧代码库,想知道它是否合法: if ($foo =~ "bar" and "baz") {

问题描述

在旧的 Perl 代码库中,有这样的:

if ($foo =~ "bar" and "baz") {

它有效!如果我用更常见的分隔符 / 替换引号,它将不起作用。有人认识这种语法吗?我找不到任何关于以这种方式与绑定运算符一起使用“和”的讨论。如果我链接第二个“and”,它也可以工作,但如果我尝试“and not”,它就不起作用。看到这段代码我很惊讶,更惊讶的是它等效于:

if ($foo =~ /bar/ && $foo =~ /baz/) {

这是合法的语法吗?如果是,我在哪里可以找到它的文档?还是它的形式非常糟糕,需要重新设计?

标签: perlstring-matching

解决方案


 if ( $foo =~ "bar" and "baz" )

相当于

 if ( ( $foo =~ "bar" ) and "baz" )

由于"baz"总是返回一个真值,以上等价于

 if ( $foo =~ "bar" )

例如,

use feature qw( say );

if ( $ARGV[0] =~ "bar" and "baz" ) {
   say "match";
} else {
   say "no match";
}

if ( $ARGV[0] =~ /bar/ && $ARGV[0] =~ /baz/ ) {
   say "match";
} else {
   say "no match";
}
$ perl a.pl oooooo
no match
no match

$ perl a.pl ooobarooo
match
no match

$ perl a.pl ooobazooo
no match
no match

$ perl a.pl ooobarbazooo
match
match

我不会称之为“工作”。


推荐阅读