значение результатов печати qr в perl - PullRequest
7 голосов
/ 22 октября 2011

Из документации , я вижу

$rex = qr/my.STRING/is;
print $rex; # prints (?si-xm:my.STRING)

Но я не уверен, как понять (?si-xm:...).Если я сделаю печать на qr/quick|lazy/, я получу (?-xism:quick|lazy).Что это значит здесь (?-xism:...) тоже?

Спасибо!

Ответы [ 3 ]

15 голосов
/ 22 октября 2011

Как объяснено на справочной странице perlre :

Любые буквы от ? до : действуют как модификаторы флагов [...]

Буквы перед - являются положительными модификаторами;те, что после него, являются отрицательными модификаторами.Так, например, (?-xism:quick|lazy) означает, что пробелы и комментарии не разрешены в скобках, часть в скобках не чувствительна к регистру, точка . делает не соответствует символам новой строки, а ^ и $ до не соответствует началу и концу строки.

11 голосов
/ 22 октября 2011

Как примечание, синтаксис (?FLAGS:pattern) претерпел изменения в perl 5.14.0, и вместе с ним изменилось регулярное выражение.Процитируем из perlre:

Начиная с Perl 5.14, сразу после «?» Стоит знак «^» (акцент или акцент).является сокращенным эквивалентом "d-imsx".Флаги (кроме "d") могут следовать за кареткой, чтобы переопределить ее.Но знак минус с ним недопустим.

(d - это одна из группы новых флагов в 5.14, которая влияет на то, как Unicode влияет на регулярные выражения; d, значение по умолчанию, означаетдействовать в основном как старые версии Perl).

С добавлением синтаксиса (?^FLAGS:pattern) строковое выражение regex изменяется в соответствии с этим синтаксисом и перечисляет только те флаги, которые отличаются от значений по умолчанию.Так qr/hello/ преобразуется в (?^:hello) (ранее (?-xism:hello)), а qr/hello/i преобразуется в (?^i:hello) (ранее (?i-xsm:hello)).

Преимущество этого изменения заключается в том, что если Perl 5.16 добавитьновый модификатор q regex (для "запуска этого совпадения на квантовом компьютере") qr/hello/ не нужно будет изменять для преобразования в (?d-xismq:hello) - он сможет оставаться (?^:hello) таким, как на 5.14.

0 голосов
/ 22 октября 2011

Они представляют /x, /i, /s, /m, если буква появляется слева от -, и отсутствие модификатора, если буква появляется справа от * 1006.*.

Назначение кода используется для передачи, какие флаги были указаны

>perl -E"$re = qr/./s;  say qq{a\nb} =~ /a${re}b/ ? 'match' : 'no match'"
match

>perl -E"$pat = '.';  say qq{a\nb} =~ /a${pat}b/ ? 'match' : 'no match'"
no match

>perl -E"$pat = '(?s-xim:.)';  say qq{a\nb} =~ /a${pat}b/ ? 'match' : 'no match'"
match

... а какие нет.

>perl -E"$re = qr/./;  say qq{a\nb} =~ /a${re}b/s ? 'match' : 'no match'"
no match

>perl -E"$pat = '.';  say qq{a\nb} =~ /a${pat}b/s ? 'match' : 'no match'"
match

>perl -E"$pat = '(?-xism:.)';  say qq{a\nb} =~ /a${pat}b/s ? 'match' : 'no match'"
no match

(?:...) задокументировано в perlre .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...