Spec-Zone.ru › Perl 5.36

perlrecharclass

СОДЕРЖАНИЕ

  • НАЗВАНИЕ
  • ОПИСАНИЕ
    • Точка
    • Последовательности с обратным слэшем
      • \N
      • Цифры
      • Символы слова
      • Пробелы
      • Свойства Unicode
        • Примеры
    • Классы символов в квадратных скобках
      • Специальные символы внутри класса символов в квадратных скобках
      • Классы символов в квадратных скобках и модификатор шаблона /xx
      • Диапазоны символов
      • Отрицание
      • Последовательности с обратным слэшем
      • Классы символов POSIX
        • Отрицание классов символов POSIX
        • [= =] и [. .]
        • Примеры
      • Расширенные классы символов в квадратных скобках

НАЗВАНИЕ

perlrecharclass - Классы символов в Perl-регулярных выражениях

ОПИСАНИЕ

Основная документация по Perl-регулярным выражениям находится в perlre.

В этом руководстве рассматривается синтаксис и использование классов символов в Perl-регулярных выражениях.

Класс символов — это способ обозначения набора символов таким образом, чтобы один символ из набора был сопоставлен. Важно помнить, что: сопоставление класса символов потребляет ровно один символ в исходной строке. (Исходная строка — это строка, с которой сопоставляется регулярное выражение.)

В Perl-регулярных выражениях существуют три типа классов символов: точка, последовательности с обратным слэшем и форма, заключенная в квадратные скобки. Имейте в виду, что часто термин «класс символов» используется только для обозначения формы в квадратных скобках.

Точка

Точка (или точка с запятой), . — это, вероятно, наиболее используемый и, безусловно, наиболее известный класс символов. По умолчанию точка сопоставляет любой символ, кроме новой строки. Это значение по умолчанию можно изменить, добавив сопоставление новой строки, используя модификатор одной строки: для всего регулярного выражения с модификатором /s или локально с помощью (?s) (и даже глобально в пределах области видимости use re '/s'). (Последовательность с обратным слэшем "\N", описанная ниже, сопоставляет любой символ, кроме новой строки, независимо от модификатора одной строки.)

Вот несколько примеров:

"a"  =~  /./       # Match
"."  =~  /./       # Match
""   =~  /./       # No match (dot has to match a character)
"\n" =~  /./       # No match (dot does not match a newline)
"\n" =~  /./s      # Match (global 'single line' modifier)
"\n" =~  /(?s:.)/  # Match (local 'single line' modifier)
"ab" =~  /^.$/     # No match (dot matches one character)

Последовательности с обратным слэшем

Последовательность с обратным слэшем — это последовательность символов, первым из которых является обратный слэш. Perl присваивает специальное значение многим таким последовательностям, и некоторые из них являются классами символов. То есть они сопоставляют один символ каждый, при условии, что этот символ принадлежит конкретному набору символов, определенному последовательностью.

Вот список последовательностей с обратным слэшем, которые являются классами символов. Они обсуждаются более подробно ниже. (Для последовательностей с обратным слэшем, которые не являются классами символов, см. perlrebackslash.)

\d             Match a decimal digit character.
\D             Match a non-decimal-digit character.
\w             Match a "word" character.
\W             Match a non-"word" character.
\s             Match a whitespace character.
\S             Match a non-whitespace character.
\h             Match a horizontal whitespace character.
\H             Match a character that isn't horizontal whitespace.
\v             Match a vertical whitespace character.
\V             Match a character that isn't vertical whitespace.
\N             Match a character that isn't a newline.
\pP, \p{Prop}  Match a character that has the given Unicode property.
\PP, \P{Prop}  Match a character that doesn't have the Unicode property

\N

\N, доступное начиная с версии 5.12, как и точка, сопоставляет любой символ, кроме новой строки. Разница в том, что \N не зависит от модификатора регулярного выражения одной строки (см. "Точка" выше). Обратите внимание, что форма \N{...} может означать совершенно другое. Когда {...} является квантификатором, это означает сопоставление одного символа, не являющегося новой строкой, много раз. Например, \N{3} означает сопоставление 3 символов, не являющихся новой строкой; \N{5,} означает сопоставление 5 или более символов, не являющихся новой строкой. Но если {...} не является допустимым квантификатором, предполагается, что это имя символа. См. charnames для них. Например, ни \N{COLON}, ни \N{4F}, ни \N{F4} не содержат допустимых квантификаторов, поэтому Perl будет пытаться найти символы, имена которых соответственно COLON, 4F, и F4.

Цифры

\d сопоставляет один символ, который считается десятичной цифрой. Если в действии модификатор регулярного выражения /a, он сопоставляет [0-9]. В противном случае он сопоставляет любой символ, сопоставляемый \p{Digit}, что включает [0-9]. (Вероятное исключение заключается в том, что в соответствии с правилами локали сопоставления текущая локали может не сопоставлять [0-9] с помощью \d, и/или может сопоставлять другие символы, код которых меньше 256. Единственное допустимое определение таких правил локали заключалось бы в сопоставлении [0-9] плюс еще одного набора из 10 последовательных символов; все остальное противоречило бы стандарту языка C, но Perl пока не делает никаких предположений по этому поводу.)

Это означает, что если модификатор /a не включен, то \d сопоставляет не только цифры от '0' до '9', но и арабские, деванагари и цифры других языков. Это может вызвать путаницу и некоторые проблемы безопасности.

Некоторые цифры, которые сопоставляет \d, похожи на некоторые из [0-9], но имеют другое значение. Например, БЕНГАЛЬСКАЯ ЦИФРА ЧЕТЫРЕ (U+09EA) очень похожа на АСКИЙСКИЙ ЦИФРУ ВОСЕМЬ (U+0038), а ЛЕПЧА ЦИФРА ШЕСТЬ (U+1C46) очень похожа на АСКИЙСКИЙ ЦИФРУ ПЯТЬ (U+0035). Приложение, которое ожидает только ASCII-цифры, может быть введено в заблуждение, или если совпадение является \d+, сопоставленная строка может содержать смесь цифр из разных систем письма, которые выглядят так, как будто они обозначают число, отличное от фактического. "num()" в Unicode::UCD можно использовать для безопасного вычисления значения, возвращая undef если входная строка содержит такую смесь. В противном случае, например, отображаемая цена может быть намеренно отличной от того, что она отображается.

То, что означает \p{Digit}, и, следовательно, \d за исключением модификатора /a, это \p{General_Category=Decimal_Number}, или синонимично \p{General_Category=Digit}. Начиная с версии Unicode 4.1, это тот же набор символов, что и сопоставленный \p{Numeric_Type=Decimal}. Но Unicode также имеет другое свойство с аналогичным названием, \p{Numeric_Type=Digit}, которое сопоставляет совершенно другой набор символов. Эти символы — это такие как CIRCLED DIGIT ONE или подстрочные символы, или взяты из систем письма, которым не хватает всех десяти цифр.

Цель дизайна заключается в том, чтобы \d точно соответствовал набору символов, которые можно безопасно использовать со стандартной десятичной позиционной системой, например, 123 означает одну сотню, плюс две десятки, плюс три единицы. Это позиционное обозначение не обязательно относится к символам, которые сопоставляются с другим типом «цифры», \p{Numeric_Type=Digit}, и поэтому \d их не сопоставляет.

Тамильские цифры (U+0BE6 - U+0BEF) также могут быть законно использованы в тамильских числах старого стиля, в которых они могут появляться не более чем по одному за раз, разделенные символами, означающими «умножить на 10», «умножить на 100» и т. д. (См. https://www.unicode.org/notes/tn21.)

Любой символ, не сопоставленный \d, сопоставляется \D.

Символы слова

\w сопоставляет один буквенно-цифровой символ (буквенный символ или десятичная цифра); или символ пунктуации соединения, такой как символ нижнего подчеркивания ("_"); или символ «метки» (как какой-то акцент), который присоединяется к одному из них. Он не сопоставляет все слово. Чтобы сопоставить все слово, используйте \w+. Это не то же самое, что сопоставление английского слова, но в диапазоне ASCII оно то же самое, что и строка символов Perl-идентификаторов.

Если модификатор /a включен ...

\w сопоставляет 63 символа [a-zA-Z0-9_].

в противном случае ...
Для кодов символов выше 255 ...

\w сопоставляет то же самое, что и \p{Word} в этом диапазоне. То есть он сопоставляет тайские буквы, греческие буквы и т. д. Это включает символы соединения (например, символ подчеркивания), которые соединяют два слова вместе, или диакритические знаки, такие как COMBINING TILDE и модификаторы букв, которые обычно используются для добавления вспомогательных меток к буквам.

Для кодов символов ниже 256 ...
если правила локали включены ...

\w сопоставляет платформенный символ нижнего подчеркивания плюс любой буквенно-цифровой символ, который локали считает таковым.

если вместо этого включены правила Unicode ...

\w сопоставляет точно то же самое, что и \p{Word}.

в противном случае ...

\w сопоставляет [a-zA-Z0-9_].

Применяемые правила определяются, как описано в "Какой модификатор набора символов активен? в perlre.

Существует ряд проблем безопасности с полным списком Unicode-символов слова. См. http://unicode.org/reports/tr36.

Кроме того, для более точного набора символов, которые находятся в идентификаторах языков программирования за пределами диапазона ASCII, вы можете вместо этого использовать более настраиваемые "Свойства Unicode", \p{ID_Start}, \p{ID_Continue}, \p{XID_Start}, и \p{XID_Continue}. См. http://unicode.org/reports/tr31.

Любой символ, не сопоставленный \w, сопоставляется \W.

Пробелы

\s сопоставляет любой одиночный символ, считающийся пробелом.

Если в действии модификатор /a ...

Во всех версиях Perl, \s соответствует 5 символам [\t\n\f\r ]; то есть, горизонтальной табуляции, новой строке, подаче формы, возврату каретки и пробелу. Начиная с Perl v5.18, он также соответствует вертикальной табуляции, \cK. См. примечание [1] ниже для обсуждения этого.

в противном случае ...
Для кодовых точек выше 255 ...

\s соответствует ровно тем кодовым точкам, превышающим 255, которые показаны в столбце "s" в таблице ниже.

Для кодовых точек ниже 256 ...
если правила локали активны ...

\s соответствует тому, что локаль считает пробелами.

если, вместо этого, действуют правила Unicode ...

\s соответствует ровно тем символам, которые показаны в столбце "s" в таблице ниже.

в противном случае ...

\s соответствует [\t\n\f\r ] и, начиная с Perl v5.18, вертикальной табуляции, \cK. (См. примечание [1] ниже для обсуждения этого.) Обратите внимание, что этот список не включает неразрывный пробел.

Правила, которые применяются, определяются, как описано в "Which character set modifier is in effect?" in perlre.

Любой символ, не соответствующий \s, соответствует \S.

\h соответствует любому символу, который считается горизонтальным пробелом; это включает пробелы и символы табуляции платформы, а также несколько других, перечисленных в таблице ниже. \H соответствует любому символу, который не считается горизонтальным пробелом. Они используют родную кодировку платформы и не учитывают никакую локали, которая может быть в использовании.

\v соответствует любому символу, который считается вертикальным пробелом; это включает символы возврата каретки и перевода строки (новая строка) платформы, а также несколько других символов, все перечисленные в таблице ниже. \V соответствует любому символу, который не считается вертикальным пробелом. Они используют родную кодировку платформы и не учитывают никакую локали, которая может быть в использовании.

\R соответствует любому символу, который можно рассматривать как перевод строки в соответствии с правилами Unicode. Он может соответствовать последовательности из нескольких символов. Он не может использоваться внутри символьного класса в квадратных скобках; используйте \v вместо него (вертикальный пробел). Он использует родную кодировку платформы и не учитывает никакую локали, которая может быть в использовании. Подробности обсуждаются в perlrebackslash.

Обратите внимание, что в отличие от \s (и \d и \w), \h и \v всегда соответствуют тем же символам, независимо от других факторов, таких как активная локаль или то, находится ли исходная строка в формате UTF-8.

Можно подумать, что \s эквивалентно [\h\v]. Это действительно так, начиная с Perl v5.18, но до этого единственное различие заключалось в том, что вертикальная табуляция ("\cK") не соответствовала \s.

Следующая таблица — это полный список символов, соответствующих \s, \h и \v по состоянию на Unicode 14.0.

Первый столбец указывает кодовую точку Unicode символа (в шестнадцатеричном формате), второй столбец — (Unicode) имя. Третий столбец указывает, по каким классам соответствует символ (в предположении, что никакая локаль не включена, которая изменяет \s сопоставление).

0x0009        CHARACTER TABULATION   h s
0x000a              LINE FEED (LF)    vs
0x000b             LINE TABULATION    vs  [1]
0x000c              FORM FEED (FF)    vs
0x000d        CARRIAGE RETURN (CR)    vs
0x0020                       SPACE   h s
0x0085             NEXT LINE (NEL)    vs  [2]
0x00a0              NO-BREAK SPACE   h s  [2]
0x1680            OGHAM SPACE MARK   h s
0x2000                     EN QUAD   h s
0x2001                     EM QUAD   h s
0x2002                    EN SPACE   h s
0x2003                    EM SPACE   h s
0x2004          THREE-PER-EM SPACE   h s
0x2005           FOUR-PER-EM SPACE   h s
0x2006            SIX-PER-EM SPACE   h s
0x2007                FIGURE SPACE   h s
0x2008           PUNCTUATION SPACE   h s
0x2009                  THIN SPACE   h s
0x200a                  HAIR SPACE   h s
0x2028              LINE SEPARATOR    vs
0x2029         PARAGRAPH SEPARATOR    vs
0x202f       NARROW NO-BREAK SPACE   h s
0x205f   MEDIUM MATHEMATICAL SPACE   h s
0x3000           IDEOGRAPHIC SPACE   h s
[1]

До Perl v5.18, \s не соответствовала вертикальной табуляции. [^\S\cK] (в некотором смысле загадочно) соответствует тому, что \s традиционно делала.

[2]

NEXT LINE и NO-BREAK SPACE могут или могут не соответствовать \s в зависимости от действующих правил. См. начало этого раздела.

Свойства Unicode

\pP и \p{Prop} — это классы символов для сопоставления символов, соответствующих заданным свойствам Unicode. Имена свойств одной буквы могут использоваться в форме \pP, где за \p следует имя свойства, в противном случае требуются фигурные скобки. При использовании фигурных скобок существует единственная форма, которая представляет собой просто имя свойства, заключенное в фигурные скобки, и составная форма, которая выглядит как \p{name=value}, что означает соответствие, если свойство "name" для символа имеет это конкретное "значение". Например, соответствие числу можно записать как /\pN/ или как /\p{Number}/, или как /\p{Number=True}/. Малые буквы соответствуют свойству Lowercase_Letter, которое имеет сокращённую форму Ll. Им нужны фигурные скобки, поэтому они записываются как /\p{Ll}/ или /\p{Lowercase_Letter}/, или /\p{General_Category=Lowercase_Letter}/ (подчеркивания необязательны). /\pLl/ является допустимым, но означает что-то другое. Это соответствует двум символам: букве (свойство Unicode \pL), за которой следует строчная буква l.

То, чему соответствует свойство Unicode, никогда не подчиняется правилам локали, и если правила локали не установлены иначе, использование свойства Unicode заставит регулярное выражение использовать правила Unicode, если оно не использует их уже.

Обратите внимание, что почти все свойства иммунны к сопоставлению без учёта регистра. То есть, добавление модификатора регулярного выражения /i не меняет того, что они сопоставляют. Но есть два набора, которые подвержены влиянию. Первый набор — Uppercase_Letter, Lowercase_Letter и Titlecase_Letter, которые все соответствуют Cased_Letter при сопоставлении без учёта регистра /i. Второй набор — Uppercase, Lowercase и Titlecase, которые все соответствуют Cased при сопоставлении без учёта регистра /i. (Разница между этими наборами заключается в том, что некоторые вещи, такие как римские цифры, встречаются как прописными, так и строчными буквами, поэтому они Cased, но не считаются буквами, поэтому они не Cased_Letter. Они на самом деле Letter_Number. ) Этот набор также включает свои подмножества PosixUpper и PosixLower, оба из которых при сопоставлении без учёта регистра /i соответствуют PosixAlpha.

Дополнительные сведения о свойствах Unicode см. в "Unicode Character Properties" in perlunicode; для полного списка возможных свойств см. "Properties accessible through \p{} and \P{}" in perluniprops, в котором отмечаются все формы, имеющие /i различия. Также можно определить свои собственные свойства. Это обсуждается в "User-Defined Character Properties" in perlunicode.

Свойства Unicode определяются (неудивительно!) только для кодовых точек Unicode. Начиная с версии v5.20, при сопоставлении с \p и \P, Perl обрабатывает кодовые точки, не являющиеся Unicode (те, которые превышают допустимый максимум Unicode 0x10FFFF), как если бы они были типичными неопределёнными кодовыми точками Unicode.

До версии v5.20 Perl выводил предупреждение и делал все соответствия с кодовыми точками, не являющимися Unicode, несоответствующими. Это могло быть несколько неожиданно:

chr(0x110000) =~ \p{ASCII_Hex_Digit=True}     # Fails on Perls < v5.20.
chr(0x110000) =~ \p{ASCII_Hex_Digit=False}    # Also fails on Perls
                                              # < v5.20

Несмотря на то, что эти два соответствия можно рассматривать как дополнения, до версии v5.20 они таковыми были только для кодовых точек Unicode.

Начиная с Perl v5.30, в значениях свойств Unicode разрешены подстановочные знаки. См. "Wildcards in Property Values" in perlunicode.

Примеры
"a"  =~  /\w/      # Match, "a" is a 'word' character.
"7"  =~  /\w/      # Match, "7" is a 'word' character as well.
"a"  =~  /\d/      # No match, "a" isn't a digit.
"7"  =~  /\d/      # Match, "7" is a digit.
" "  =~  /\s/      # Match, a space is whitespace.
"a"  =~  /\D/      # Match, "a" is a non-digit.
"7"  =~  /\D/      # No match, "7" is not a non-digit.
" "  =~  /\S/      # No match, a space is not non-whitespace.

" "  =~  /\h/      # Match, space is horizontal whitespace.
" "  =~  /\v/      # No match, space is not vertical whitespace.
"\r" =~  /\v/      # Match, a return is vertical whitespace.

"a"  =~  /\pL/     # Match, "a" is a letter.
"a"  =~  /\p{Lu}/  # No match, /\p{Lu}/ matches upper case letters.

"\x{0e0b}" =~ /\p{Thai}/  # Match, \x{0e0b} is the character
                          # 'THAI CHARACTER SO SO', and that's in
                          # Thai Unicode class.
"a"  =~  /\P{Lao}/ # Match, as "a" is not a Laotian character.

Стоит подчеркнуть, что \d, \w, и т. д. соответствуют отдельным символам, а не целым числам или словам. Для соответствия числу (состоящему из цифр) используйте \d+; для соответствия слову используйте \w+. Но будьте внимательны к соображениям безопасности при их использовании, как упоминалось выше.

Символьные классы в квадратных скобках

Третья форма символьного класса, которую можно использовать в регулярных выражениях Perl, — это символьный класс в квадратных скобках. В своей простейшей форме он перечисляет символы, которые могут быть сопоставлены, заключенные в квадратные скобки, например так: [aeiou]. Это соответствует одному из a, e, i, o или u. Как и другие символьные классы, точно один символ сопоставляется.* Для сопоставления более длинной строки, состоящей из символов, упомянутых в символьном классе, следует добавить к символьном классу квантификатор. Например, [aeiou]+ соответствует одному или нескольким строчным английским гласным.

Повторение символа в символьном классе не оказывает никакого эффекта; он считается в наборе только один раз.

Примеры:

"e"  =~  /[aeiou]/        # Match, as "e" is listed in the class.
"p"  =~  /[aeiou]/        # No match, "p" is not listed in the class.
"ae" =~  /^[aeiou]$/      # No match, a character class only matches
                          # a single character.
"ae" =~  /^[aeiou]+$/     # Match, due to the quantifier.

-------

* Существуют два исключения из правила, что символьный класс в квадратных скобках соответствует только одному символу. Каждый требует специальной обработки Perl, чтобы все работало:

  • Когда класс должен соответствовать без учёта регистра в правилах сопоставления /i, и символ, который явно указан внутри класса, соответствует последовательности из нескольких символов без учёта регистра в соответствии с правилами Unicode, класс также будет соответствовать этой последовательности. Например, Unicode говорит, что буква LATIN SMALL LETTER SHARP S должна соответствовать последовательности ss при правилах сопоставления /i. Таким образом,

    'ss' =~ /\A\N{LATIN SMALL LETTER SHARP S}\z/i             # Matches
    'ss' =~ /\A[aeioust\N{LATIN SMALL LETTER SHARP S}]\z/i    # Matches

    Для этого класс не должен быть инвертированным (см. "Инверсия"), символ должен быть явно указан и не должен быть частью диапазона из нескольких символов (даже не в качестве одного из его конечных точек). ("Диапазоны символов" будут объяснены вскоре.) Поэтому,

    'ss' =~ /\A[\0-\x{ff}]\z/ui       # Doesn't match
    'ss' =~ /\A[\0-\N{LATIN SMALL LETTER SHARP S}]\z/ui   # No match
    'ss' =~ /\A[\xDF-\xDF]\z/ui   # Matches on ASCII platforms, since
                                  # \xDF is LATIN SMALL LETTER SHARP S,
                                  # and the range is just a single
                                  # element

    Обратите внимание, что не стоит указывать такие типы диапазонов.

  • Некоторые имена, известные \N{...}, относятся к последовательности из нескольких символов вместо обычного отдельного символа. При включении одного из этих имен в класс будет соответствовать вся последовательность. Например,

    "\N{TAMIL LETTER KA}\N{TAMIL VOWEL SIGN AU}"
                                =~ / ^ [\N{TAMIL SYLLABLE KAU}]  $ /x;

    сопоставляется, потому что \N{TAMIL SYLLABLE KAU} — это именованная последовательность, состоящая из двух символов, соответствующих ей. Как и в другом случае, когда символьный класс может соответствовать нескольким символам, и по схожим причинам, класс не должен быть инвертированным, и именованная последовательность не может находиться в диапазоне, даже если она является обеими его конечными точками. Если это произойдёт, это приведёт к ошибке, если символьный класс находится в области действия use re 'strict или в расширенном (?[...]) классе; в противном случае используется только первая кодовая точка (с выводом предупреждения типа regexp).

Специальные символы внутри символьного класса в квадратных скобках

Большинство символов, которые являются метасимволами в регулярных выражениях (то есть символы, которые имеют специальное значение, например ., *, или () теряют своё специальное значение и могут использоваться внутри класса символов без необходимости экранирования. Например, [()] соответствует либо открывающей, либо закрывающей скобке, а скобки внутри класса символов не группируют и не захватывают. Обратите внимание, что, если шаблон не оценивается в контексте с одинарными кавычками, интерполяция переменных произойдёт до разбора скобочного класса:

$, = "\t| ";
$a =~ m'[$,]';        # single-quotish: matches '$' or ','
$a =~ q{[$,]}'        # same
$a =~ m/[$,]/;        # double-quotish: Because we made an
                      #   assignment to $, above, this now
                      #   matches "\t", "|", or " "

Символы, которые могут иметь специальное значение внутри класса символов, это \, ^, -, [ и ], и они обсуждаются ниже. Их можно экранировать обратной косой чертой, хотя иногда это не требуется, в таком случае обратную косую черту можно опустить.

Последовательность \b является специальной внутри скобочного класса символов. Вне класса символов \b представляет собой утверждение, указывающее на точку, у которой по обе стороны нет ни двух символов слова, ни двух несимволов слова. Внутри скобочного класса символов \b соответствует символу обратного удаления.

Последовательности \a, \c, \e, \f, \n, \N{NAME}, \N{U+hex char}, \r, \t, и \x также являются специальными и имеют те же значения, что и вне скобочного класса символов.

Также обратная косая черта, за которой следуют две или три восьмеричные цифры, считается восьмеричным числом.

[ не является специальным внутри класса символов, если это не начало класса символов POSIX (см. "Классы символов POSIX" ниже). Обычно его не нужно экранировать.

] обычно обозначает либо конец класса символов POSIX (см. "Классы символов POSIX" ниже), либо конец скобочного класса символов. Если вы хотите включить ] в набор символов, его нужно экранировать.

Однако, если ] является первым (или вторым, если первый символ — символ возведения в степень) символом скобочного класса символов, он не обозначает конец класса (так как пустой класс невозможен) и считается частью набора символов, которые можно сопоставить без экранирования.

Примеры:

"+"   =~ /[+?*]/     #  Match, "+" in a character class is not special.
"\cH" =~ /[\b]/      #  Match, \b inside in a character class
                     #  is equivalent to a backspace.
"]"   =~ /[][]/      #  Match, as the character class contains
                     #  both [ and ].
"[]"  =~ /[[]]/      #  Match, the pattern contains a character class
                     #  containing just [, and the character class is
                     #  followed by a ].

Классы символов в скобках и модификатор шаблона /xx

Обычно символы ПРОБЕЛА и ТАБУляции не имеют специального значения внутри скобочного класса символов; они просто добавляются в список символов, соответствующих классу. Но если модификатор шаблона /xx активен, они обычно игнорируются и могут быть добавлены для повышения удобочитаемости. Их нельзя добавить в середину отдельной конструкции:

/ [ \x{10 FFFF} ] /xx  # WRONG!

ПРОБЕЛ в середине шестнадцатеричной константы является недопустимым.

Для указания символа ПРОБЕЛА вы можете экранировать его обратной косой чертой, например:

/[ a e i o u \  ]/xx

Это соответствует гласным английского языка плюс символу ПРОБЕЛА.

Для ясности, вы уже должны использовать \t для указания символа табуляции, а \t не подвергается воздействию /xx.

Диапазоны символов

Часто требуется сопоставить диапазон символов. К счастью, вместо перечисления всех символов в диапазоне можно использовать дефис (-). Если внутри скобочного класса символов у вас есть два символа, разделённые дефисом, это интерпретируется так, как будто все символы между ними находятся в классе. Например, [0-9] соответствует любой цифре ASCII, а [a-m] соответствует любой строчной букве из первой половины ASCII алфавита.

Обратите внимание, что два символа по обе стороны дефиса не обязательно должны быть обе буквы или обе цифры. Возможен любой символ, хотя это не рекомендуется. ['-?] содержит диапазон символов, но большинство людей не знают, какие это символы. Кроме того, такие диапазоны могут привести к проблемам с портативностью, если код должен работать на платформе, использующей другой набор символов, например EBCDIC.

Если дефис внутри класса символов не может синтаксически быть частью диапазона, например, потому что это первый или последний символ класса символов, или если он следует сразу за диапазоном, дефис не является специальным, и поэтому рассматривается как символ, который нужно сопоставить буквально. Если вы хотите, чтобы дефис в вашем наборе символов соответствовал и его положение в классе таково, что он может рассматриваться как часть диапазона, вы должны экранировать этот дефис обратной косой чертой.

Примеры:

[a-z]       #  Matches a character that is a lower case ASCII letter.
[a-fz]      #  Matches any letter between 'a' and 'f' (inclusive) or
            #  the letter 'z'.
[-z]        #  Matches either a hyphen ('-') or the letter 'z'.
[a-f-m]     #  Matches any letter between 'a' and 'f' (inclusive), the
            #  hyphen ('-'), or the letter 'm'.
['-?]       #  Matches any of the characters  '()*+,-./0123456789:;<=>?
            #  (But not on an EBCDIC platform).
[\N{APOSTROPHE}-\N{QUESTION MARK}]
            #  Matches any of the characters  '()*+,-./0123456789:;<=>?
            #  even on an EBCDIC platform.
[\N{U+27}-\N{U+3F}] # Same. (U+27 is "'", and U+3F is "?")

Как показывают два последних примера выше, вы можете добиться портативности на платформы, отличные от ASCII, используя форму \N{...} для конечных точек диапазона. Эти формы указывают, что заданный диапазон должен интерпретироваться с использованием значений Unicode, поэтому [\N{U+27}-\N{U+3F}] означает сопоставление \N{U+27}, \N{U+28}, \N{U+29}, ..., \N{U+3D}, \N{U+3E}, и \N{U+3F}, независимо от того, какими являются кодовые точки этих символов. Они называются диапазонами «Unicode». Если один из концов имеет форму \N{...}, диапазон считается Unicode. Предупреждение regexp выдаётся в "use re 'strict'" случае, если другая конечная точка указана не портативно:

[\N{U+00}-\x09]    # Warning under re 'strict'; \x09 is non-portable
[\N{U+00}-\t]      # No warning;

Оба вышеперечисленных соответствуют символам \N{U+00} \N{U+01}, ... \N{U+08}, \N{U+09}, но \x09 выглядит как возможная ошибка, поэтому предупреждение выдаётся (в re 'strict') для него.

Perl также гарантирует, что диапазоны A-Z, a-z, 0-9, и любые поддиапазоны этих диапазонов соответствуют тому, что ожидало бы английское говорящее лицо на любой платформе. То есть [A-Z] соответствует 26 прописным буквам ASCII; [a-z] соответствует 26 строчным буквам; а [0-9] соответствует 10 цифрам. Поддиапазоны, такие как [h-k], соответствуют соответственно, в этом случае — четырём буквам "h", "i", "j", и "k". Это естественное поведение на платформах ASCII, где кодовые точки (порядковые значения) для "h" через "k" являются последовательными целыми числами (0x68 до 0x6B). Но для достижения этого может потребоваться специальное обращение на платформах с не-ASCII нативным набором символов. Например, на платформах EBCDIC кодовая точка для "h" равна 0x88, "i" равна 0x89, "j" равна 0x91, и "k" равна 0x92. Perl специально обрабатывает [h-k] для исключения семи кодовых точек в промежутке: 0x8A до 0x90. Это специальное обращение используется только тогда, когда диапазон является поддиапазоном одного из диапазонов ASCII прописных букв, строчных букв и цифр, И каждый конец диапазона выражен либо как литерал, например "A", либо как именованный символ (\N{...}, включая форму \N{U+...).

Примеры EBCDIC:

[i-j]               #  Matches either "i" or "j"
[i-\N{LATIN SMALL LETTER J}]  # Same
[i-\N{U+6A}]        #  Same
[\N{U+69}-\N{U+6A}] #  Same
[\x{89}-\x{91}]     #  Matches 0x89 ("i"), 0x8A .. 0x90, 0x91 ("j")
[i-\x{91}]          #  Same
[\x{89}-j]          #  Same
[i-J]               #  Matches, 0x89 ("i") .. 0xC1 ("J"); special
                    #  handling doesn't apply because range is mixed
                    #  case

Отрицание

Также можно указать символы, которые вы не хотите сопоставлять. Для этого можно использовать символ возведения в степень (^) в качестве первого символа класса символов. Например, [^a-z] соответствует любому символу, который не является строчной буквой ASCII, что включает более миллиона кодовых точек Unicode. Класс считается «отрицательным» или «инвертированным».

Этот синтаксис делает символ возведения в степень специальным символом внутри скобочного класса символов, но только если это первый символ класса. Поэтому, если вам нужен символ возведения в степень как один из символов для сопоставления, либо экранируйте символ возведения в степень, либо не указывайте его первым.

В инвертированных скобочных классах символов Perl игнорирует правила Unicode, которые обычно говорят, что именованные последовательности и определённые символы должны соответствовать последовательности нескольких символов при использовании регистронезависимого /i сопоставления. Следование этим правилам может привести к чрезвычайно запутанным ситуациям:

"ss" =~ /^[^\xDF]+$/ui;   # Matches!

Это должно соответствовать любым последовательностям символов, которые не являются \xDF ни тем, что соответствует \xDF в /i. "s" не \xDF, но Unicode гласит, что "ss" соответствует \xDF в /i. Так какой же из них «выигрывает»? Не удастся ли сопоставление из-за наличия ss или принять его, потому что в нём есть s , за которым следует ещё один s? Perl выбрал последний вариант. (См. примечание в "Скобочные классы символов" выше.)

Примеры:

"e"  =~  /[^aeiou]/   #  No match, the 'e' is listed.
"x"  =~  /[^aeiou]/   #  Match, as 'x' isn't a lowercase vowel.
"^"  =~  /[^^]/       #  No match, matches anything that isn't a caret.
"^"  =~  /[x^]/       #  Match, caret is not special here.

Последовательности обратной косой черты

Вы можете поместить любой символ класса символов с обратной косой чертой (за исключением \N и \R) внутри скобочного класса символов, и он будет вести себя так, как будто вы поместили все символы, соответствующие последовательности обратной косой черты, внутри класса символов. Например, [a-f\d] соответствует любой десятичной цифре или любой строчной букве от 'a' до 'f' включительно.

\N внутри скобочного класса символов должно иметь формы \N{name} или \N{U+hex char}, и НЕ иметь форму, которая соответствует символам, кроме символа новой строки, по той же причине, что и точка . внутри скобочного класса символов теряет своё специальное значение: она соответствует практически любому символу, что обычно не нужно.

Примеры:

/[\p{Thai}\d]/     # Matches a character that is either a Thai
                   # character, or a digit.
/[^\p{Arabic}()]/  # Matches a character that is neither an Arabic
                   # character, nor a parenthesis.

Последовательности символов с обратной косой чертой не могут образовывать одну из конечных точек диапазона. Таким образом, вы не можете сказать:

/[\p{Thai}-\d]/     # Wrong!

Классы символов POSIX

Классы символов POSIX имеют вид [:class:], где class — имя, а [: и :] — разделители. Классы символов POSIX появляются только внутри скобочных классов символов и являются удобным и описательным способом перечисления группы символов.

Будьте внимательны к синтаксису,

# Correct:
$string =~ /[[:alpha:]]/

# Incorrect (will warn):
$string =~ /[:alpha:]/

В последнем шаблоне был бы класс символов, состоящий из двоеточия и букв a, l, p и h.

Классы символов POSIX могут быть частью более крупного скобочного класса символов. Например,

[01[:alpha:]%]

является допустимым и соответствует '0', '1', любой букве и знаку процента.

Perl распознаёт следующие классы символов POSIX:

alpha  Any alphabetical character (e.g., [A-Za-z]).
alnum  Any alphanumeric character (e.g., [A-Za-z0-9]).
ascii  Any character in the ASCII character set.
blank  A GNU extension, equal to a space or a horizontal tab ("\t").
cntrl  Any control character.  See Note [2] below.
digit  Any decimal digit (e.g., [0-9]), equivalent to "\d".
graph  Any printable character, excluding a space.  See Note [3] below.
lower  Any lowercase character (e.g., [a-z]).
print  Any printable character, including a space.  See Note [4] below.
punct  Any graphical character excluding "word" characters.  Note [5].
space  Any whitespace character. "\s" including the vertical tab
       ("\cK").
upper  Any uppercase character (e.g., [A-Z]).
word   A Perl extension (e.g., [A-Za-z0-9_]), equivalent to "\w".
xdigit Any hexadecimal digit (e.g., [0-9a-fA-F]).  Note [7].

Подобно свойствам Unicode, большинство свойств POSIX соответствуют одному и тому же, независимо от того, включено ли регистронезависимое (/i ) сопоставление или нет. Исключение составляют [:upper:] и [:lower:]. В /i, каждый из них соответствует объединению [:upper:] и [:lower:].

Большинство классов символов POSIX имеют два аналога свойств в стиле Unicode. (Они не являются официальными свойствами Unicode, но расширения Perl, полученные из официальных свойств Unicode.) Таблица ниже показывает соотношение между классами символов POSIX и этими аналогами.

Один аналог, в столбце, помеченном «Диапазон ASCII Unicode» в таблице, соответствует только символам в наборе символов ASCII.

Другой аналог, в столбце «Полный Unicode», соответствует любым подходящим символам в полном наборе символов Unicode. Например, \p{Alpha} соответствует не только символам латинского алфавита ASCII, но и любому символу в полном наборе символов Unicode, считающемуся буквой. Запись в столбце «последовательность с обратной косой чертой» — это (короткая) эквивалентность.

[[:...:]]      ASCII-range          Full-range  backslash  Note
                Unicode              Unicode     sequence
-----------------------------------------------------
  alpha      \p{PosixAlpha}       \p{XPosixAlpha}
  alnum      \p{PosixAlnum}       \p{XPosixAlnum}
  ascii      \p{ASCII}
  blank      \p{PosixBlank}       \p{XPosixBlank}  \h      [1]
                                  or \p{HorizSpace}        [1]
  cntrl      \p{PosixCntrl}       \p{XPosixCntrl}          [2]
  digit      \p{PosixDigit}       \p{XPosixDigit}  \d
  graph      \p{PosixGraph}       \p{XPosixGraph}          [3]
  lower      \p{PosixLower}       \p{XPosixLower}
  print      \p{PosixPrint}       \p{XPosixPrint}          [4]
  punct      \p{PosixPunct}       \p{XPosixPunct}          [5]
             \p{PerlSpace}        \p{XPerlSpace}   \s      [6]
  space      \p{PosixSpace}       \p{XPosixSpace}          [6]
  upper      \p{PosixUpper}       \p{XPosixUpper}
  word       \p{PosixWord}        \p{XPosixWord}   \w
  xdigit     \p{PosixXDigit}      \p{XPosixXDigit}         [7]
[1]

\p{Blank} и \p{HorizSpace} — синонимы.

[2]

Управляющие символы не производят вывод как таковой, а обычно каким-то образом управляют терминалом: например, перевод строки и возврат каретки — это управляющие символы. На платформах ASCII, в диапазоне ASCII, символы, кодовые точки которых находятся в диапазоне от 0 до 31 включительно, плюс 127 (DEL) — это управляющие символы; на платформах EBCDIC их аналоги — управляющие символы.

[3]

Любой символ, который является графическим, то есть видимым. Этот класс состоит из всех буквенно-цифровых символов и всех знаков препинания.

[4]

Все печатаемые символы, которые представляют собой набор всех графических символов плюс те символы пробела, которые не являются также управляющими.

[5]

\p{PosixPunct} и [[:punct:]] в диапазоне ASCII соответствуют всем не-управляющим, не-буквенно-цифровым, не-пробельным символам: [-!"#$%&'()*+,./:;<=>?@[\\\]^_`{|}~] (хотя если в действии локаль, она может изменить поведение [[:punct:]]).

Аналогичное свойство \p{Punct} в диапазоне ASCII соответствует несколько другому набору, а именно [-!"#%&'()*,./:;?@[\\\]_{}]. То есть ему не хватает девяти символов [$+<=>^`|~]. Это происходит потому, что Unicode разделяет то, что POSIX считает пунктуацией, на две категории: пунктуация и символы.

\p{XPosixPunct} и (согласно правилам Unicode) [[:punct:]], соответствуют тому, что \p{PosixPunct} соответствует в диапазоне ASCII, плюс тому, что \p{Punct} соответствует. Это отличается от строгого соответствия по \p{Punct}. Другой способ сказать это состоит в том, что если в действии правила Unicode, [[:punct:]] соответствует всем символам, которые Unicode считает знаками пунктуации, плюс все символы из диапазона ASCII, которые Unicode считает символами.

[6]

\p{XPerlSpace} и \p{Space} соответствуют одинаково, начиная с Perl v5.18. В более ранних версиях они отличаются только тем, что в случае соответствия без учета локали \p{XPerlSpace} не соответствовал вертикальной вкладке \cK. То же самое относится к двум формам, ограниченным диапазоном ASCII.

[7]

В отличие от [[:digit:]], который соответствует цифрам во многих системах письма, таких как тайский и деванагари, в настоящее время существует всего два набора шестнадцатеричных цифр, и маловероятно, что их будет добавлено больше. Это связано с тем, что вам нужны не только десять цифр, но и шесть [A-F] (и [a-f]) для соответствия. Это означает, что только латинский шрифт подходит для этого, и Unicode содержит всего два набора таких цифр: знакомый набор ASCII и полные широкие формы, начинающиеся с U+FF10 (полная ширина нуля).

Существует множество других синонимов, которые можно использовать помимо перечисленных в таблице. Например, \p{XPosixAlpha} можно записать как \p{Alpha}. Все они перечислены в "Свойства, доступные через \p{} и \P{}" в perluniprops.

Оба аналога \p всегда предполагают, что в действии правила Unicode. На платформах ASCII это означает, что они предполагают, что кодовые точки от 128 до 255 — это Latin-1, и это означает, что использование их с правилами локали неразумно, если локаль не гарантированно является Latin-1 или UTF-8. Напротив, классы символов POSIX полезны в правилах локали. Они зависят от фактически действующих правил, как показано ниже:

Если в действии модификатор /a, ...

Каждый из классов POSIX соответствует точно так же, как и его аналоги в диапазоне ASCII.

в противном случае ...
Для кодовых точек выше 255 ...

Класс POSIX соответствует тому же, что и его аналог Полного диапазона.

Для кодовых точек ниже 256 ...
если в действии правила локали ...

Класс POSIX соответствует правилам локали, за исключением:

word

также включает в себя нативный символ подчеркивания платформы, независимо от локали.

ascii

на платформах, которые не имеют расширения POSIX ascii, это соответствует только нативным символам ASCII платформы.

blank

на платформах, которые не имеют расширения POSIX blank, это соответствует только символам табуляции и пробела платформы.

если вместо этого в действии правила Unicode ...

Класс POSIX соответствует тому же, что и аналог Полного диапазона.

в противном случае ...

Класс POSIX соответствует тому же, что и аналог диапазона ASCII.

Какие правила применяются, определяется как описано в "Какой модификатор набора символов в действии?" в perlre.

Отрицание классов символов POSIX

Расширением Perl для класса символов POSIX является возможность его отрицания. Это делается путем добавления символа «^» перед именем класса (^). Некоторые примеры:

    POSIX         ASCII-range     Full-range  backslash
                   Unicode         Unicode    sequence
-----------------------------------------------------
[[:^digit:]]   \P{PosixDigit}  \P{XPosixDigit}   \D
[[:^space:]]   \P{PosixSpace}  \P{XPosixSpace}
               \P{PerlSpace}   \P{XPerlSpace}    \S
[[:^word:]]    \P{PerlWord}    \P{XPosixWord}    \W

Последовательность с обратной косой чертой может означать либо ASCII, либо полный Unicode, в зависимости от различных факторов, как описано в "Какой модификатор набора символов в действии?" в perlre.

[= =] и [. .]

Perl распознает классы символов POSIX [=class=] и [.class.], но пока не поддерживает их. Любая попытка использовать какой-либо из этих конструктов вызывает исключение.

Примеры
/[[:digit:]]/            # Matches a character that is a digit.
/[01[:lower:]]/          # Matches a character that is either a
                         # lowercase letter, or '0' or '1'.
/[[:digit:][:^xdigit:]]/ # Matches a character that can be anything
                         # except the letters 'a' to 'f' and 'A' to
                         # 'F'.  This is because the main character
                         # class is composed of two POSIX character
                         # classes that are ORed together, one that
                         # matches any digit, and the other that
                         # matches anything that isn't a hex digit.
                         # The OR adds the digits, leaving only the
                         # letters 'a' to 'f' and 'A' to 'F' excluded.

Расширенные скобочные классы символов

Это сложный скобочный класс символов, который можно использовать для более читабельных и менее подверженных ошибкам классов и для выполнения операций над множествами, таких как пересечение. Например,

/(?[ \p{Thai} & \p{Digit} ])/

Это соответствует всем символам цифр, которые находятся в тайском шрифте.

Эта функция стала доступна в Perl 5.18 как экспериментальная; принята в 5.36.

Применяются правила, используемые use re 'strict, к этой конструкции.

Мы можем расширить приведенный выше пример:

/(?[ ( \p{Thai} + \p{Lao} ) & \p{Digit} ])/

Это соответствует цифрам, которые находятся в тайском или лаосском шрифте.

Обратите внимание на пробелы в этих примерах. В этой конструкции всегда включен модификатор /xx.

Доступные бинарные операторы:

&    intersection
+    union
|    another name for '+', hence means union
-    subtraction (the result matches the set consisting of those
     code points matched by the first operand, excluding any that
     are also matched by the second operand)
^    symmetric difference (the union minus the intersection).  This
     is like an exclusive or, in that the result is the set of code
     points that are matched by either, but not both, of the
     operands.

Есть один унарный оператор:

!    complement

Все бинарные операторы левоассоциативны; "&" имеет более высокий приоритет, чем другие, которые имеют равный приоритет. Унарный оператор правоассоциативен и имеет наивысший приоритет. Таким образом, это соответствует обычным правилам Perl для логических операторов. Используйте скобки для переопределения приоритета и ассоциативности по умолчанию.

Основное ограничение состоит в том, что все — метасимволы. Поэтому вы не можете ссылаться на отдельные символы, выполняя действия, подобные этому:

/(?[ a + b ])/ # Syntax error!

Самый простой способ указать отдельный вводимый символ — заключить его в квадратные скобки:

/(?[ [a] + [b] ])/

(Это то же самое, что и [ab].) Вы также могли бы сказать эквивалентное:

/(?[[ a b ]])/

(Конечно, вы можете указать отдельные символы, используя \x{...}, \N{...}, и т. д.)

Последний пример демонстрирует использование этой конструкции для указания обычного скобочного класса символов без дополнительных операций над множествами. Обратите внимание на пробелы внутри него. Это разрешено, потому что /xx автоматически включается в эту конструкцию.

Все остальные эскейпы, принятые обычными скобочными классами символов, принимаются и здесь.

Поскольку эта конструкция компилируется в режиме use re 'strict, нераспознанные эскейпы, которые генерируют предупреждения в обычных классах, являются фатальными ошибками здесь, а также все другие предупреждения от этих элементов класса, а также некоторые практики, которые в настоящее время не предупреждают вне re 'strict'. Например, вы не можете сказать

/(?[ [ \xF ] ])/     # Syntax error!

Вам необходимо иметь две шестнадцатеричные цифры после бесклассового \x (используйте ведущий ноль для получения двух). Эти ограничения направлены на снижение вероятности ошибок ввода, которые приводят к тому, что класс не соответствует тому, что вы ожидали.

Если обычный скобочный класс символов содержит \p{} или \P{} и сопоставляется с кодовой точкой, не являющейся Unicode, может быть выдано предупреждение, поскольку результат не определен Unicode. Такого предупреждения не будет при использовании этого расширенного формата.

Последнее различие между обычными скобочными классами символов и этими классами заключается в том, что получить соответствие сложной замены не представляется возможным. Таким образом,

/(?[ [\xDF] ])/iu

не соответствует строке ss.

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

/(?[ [:word:] - [:lower:] ])/
/(?[ [[:word:]] - [[:lower:]] ])/

Любые содержащиеся классы символов POSIX, включая такие вещи, как \w и \D учитывают модификаторы /a (и /aa).

Обратите внимание, что (?[ ]) — это конструкция на этапе компиляции регулярного выражения. Любая попытка использовать то, что невозможно узнать во время компиляции содержащего регулярного выражения, — это фатальная ошибка. На практике это означает только три ограничения:

  1. При компиляции в рамках действия use locale (или модификатора регулярного выражения /l) эта конструкция предполагает, что локаль времени выполнения будет UTF-8, и сгенерированный шаблон всегда использует правила Unicode. Таким образом, соответствие или несоответствие не зависит от фактической локали времени выполнения, поэтому искажение не включено. Но предупреждение о категории locale генерируется, если локаль времени выполнения окажется не UTF-8.

  2. Любое пользовательское свойство, используемое, должно быть определено к моменту компиляции регулярного выражения (хотя эту конструкцию можно использовать вместо таких свойств).

  3. Регулярное выражение, которое в противном случае было бы скомпилировано с использованием правил /d, а также использующее эту конструкцию, вместо этого будет использовать /u. Таким образом, эта конструкция сообщает Perl, что вы не хотите применять правила /d для всего регулярного выражения, содержащего его.

Обратите внимание, что пропускание пробелов применяется только к внутренней части этой конструкции. Не должно быть пробелов между символами, которые образуют начальные (?[. Также не должно быть пробелов между закрывающими символами ]).

Как и во всех регулярных выражениях, шаблон может быть построен путём включения переменных, которые интерполируются во время компиляции регулярного выражения. Но в настоящее время каждый такой подкомпонент должен быть уже скомпилированным расширенным скобочным классом символов.

my $thai_or_lao = qr/(?[ \p{Thai} + \p{Lao} ])/;
...
qr/(?[ \p{Digit} & $thai_or_lao ])/;

Если вы интерполируете что-то другое, шаблон всё равно может скомпилироваться (или может и не скомпилироваться), но если он скомпилируется, он вполне может вести себя не так, как вы ожидаете:

my $thai_or_lao = '\p{Thai} + \p{Lao}';
qr/(?[ \p{Digit} & $thai_or_lao ])/;

скомпилируется в

qr/(?[ \p{Digit} & \p{Thai} + \p{Lao} ])/;

Это не имеет того эффекта, которого, скорее всего, ожидал бы человек, читающий исходный код, так как пересечение применяется только к \p{Thai}, исключая лаосский.

Из-за того, как Perl парсит вещи, вам может потребоваться сбалансировать скобки и квадратные скобки, включая комментарии. Если вы столкнётесь с какими-либо примерами, пожалуйста, отправьте их на https://github.com/Perl/perl5/issues, чтобы мы могли получить конкретный пример для этой страницы справки.

© 1993–2021 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.36.0/perlrecharclass

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API