Обнаружил, что это старая база кода, и мне интересно, если это le git: if ($ foo = ~ "bar" and "baz") { - PullRequest
1 голос
/ 17 июня 2020

В старой кодовой базе Perl это:

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

, и это работает! Если я заменю кавычки более общим разделителем, /, это не сработает. Кто-нибудь узнает этот синтаксис? Я не могу найти никаких обсуждений использования "и" таким образом с оператором привязки. Это также работает, если я использую второе «и», но не работает, если я пытаюсь «а не». Я был удивлен, увидев этот код, и еще больше удивился, увидев, что он работает эквивалентно:

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

Является ли это допустимым синтаксисом, и если да, то где я могу найти его задокументированный? Или это крайне дурной тон и требует доработки?

1 Ответ

4 голосов
/ 17 июня 2020
 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

Я бы не назвал это «рабочим».

...