Соответствие Perl чередуется с круглыми скобками

Может ли кто-нибудь объяснить, почему мое сопоставление ведет себя по-разному, независимо от того, включено ли чередование в группу захвата?

Возможно, это связано со старой версией Perl (которую я, к сожалению, не контролирую), или я что-то неправильно понимаю? Насколько я понимаю, скобки были условием для некоторых людей, но в этом случае они не нужны.

[~]$ perl -v

This is perl, v5.6.1 built for PA-RISC1.1-thread-multi
(with 1 registered patch, see perl -V for more detail)

Copyright 1987-2001, Larry Wall

Binary build 633 provided by ActiveState Corp. http://www.ActiveState.com
Built 12:17:09 Jun 24 2002


Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using `man perl' or `perldoc perl'.  If you have access to the
Internet, point your browser at http://www.perl.com/, the Perl Home Page.

[~]$ perl -e 'print "match\n" if ("getnew" =~ /^get|put|remove$/);'
match
[~]$ perl -e 'print "match\n" if ("getnew" =~ /^(get|put|remove)$/);'
[~]$

2 ответа

Решение

^get|put|remove$ находки ^get или же put или же remove$, Итак, "getnew" соответствует шаблону, потому что он начинается с get,

В то время как ^(get|put|remove)$ находки ^get$ или же ^put$ или же ^remove$,

По замыслу, "или" | выделяется для группы захвата, если она заключена в круглые скобки.

Второе регулярное выражение использует круглые скобки вокруг 3 слов, поэтому оно эквивалентно следующему по переходному свойству:

if ("getnew" =~ /^get$/ || "getnew" =~ /^put$/ || "getnew" =~ /^remove$/) {
     print "match\n" ;
}

Однако первое регулярное выражение не имеет скобок, поэтому "или" влияет на все выражение, включая граничные условия. Это соответствует, потому что первый тест, /^get/, успешно:

if ("getnew" =~ /^get/ || "getnew" =~ /put/ || "getnew" =~ /remove$/) {
     print "match\n" ;
}
Другие вопросы по тегам