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

Found this is an old code base and am wondering if it is legit: if ($foo =~ "bar" and "baz") {

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

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

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

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

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

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

等同于

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

因为"baz"总是returns一个真值,以上等价于

 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

我不会这样称呼 "working"。