Spec-Zone.ru › Perl 5.38

perlrecharclass

СОДЕРЖАНИЕ

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

НАЗВАНИЕ

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

ОПИСАНИЕ

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

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

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

В 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 соответствует тому, что локаль определяет как пробел.

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

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

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

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

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

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

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

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

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

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

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

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

Первый столбец содержит кодовую точку символа в формате шестнадцатеричного представления, второй — (Юникод) название. Третий столбец указывает, к каким классам соответствует символ (при условии, что никакая локаль не активна и не изменяет соответствие \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]

Следующая строка и неразрывный пробел могут или не могут соответствовать \s в зависимости от действующих правил. См. начало этого раздела.

Свойства Юникода

\pP и \p{Prop} — это классы символов для соответствия символам, которые подходят под заданные свойства Юникода. Имена свойств одной буквы могут использоваться в форме \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/ допустимо, но означает нечто иное. Оно соответствует строке из двух символов: букве (свойство Юникода \pL) и за ней маленькой l.

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

Обратите внимание, что почти все свойства невосприимчивы к регистру. То есть, добавление модификатора регулярного выражения /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 Character Properties" в perlunicode; для получения полного списка возможных свойств см. "Properties accessible through \p{} and \P{}" в perluniprops, который отмечает все формы, которые имеют /i различия. Также можно определить свои собственные свойства. Об этом говорится в "User-Defined Character Properties" в perlunicode.

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

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

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

Несмотря на то, что эти два соответствия могут рассматриваться как дополнения, до версии 5.20 они таковыми были только для кодовых точек Юникода.

Начиная с версии perl 5.30, в значениях свойств Юникода разрешены подстановочные знаки. См. "Wildcards in Property Values" в 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, и символ, который явно указан внутри класса, соответствует последовательности нескольких символов без учёта регистра в соответствии с правилами Юникода, класс также будет соответствовать этой последовательности. Например, Юникод гласит, что буква 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 в стиле \p. (Они не являются официальными свойствами Unicode, а расширения Perl, полученные из официальных свойств Unicode.) В таблице ниже показано соотношение между классами символов POSIX и этими аналогами.

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

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

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

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

[6]

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

[7]

В отличие от [[:digit:]], который соответствует цифрам во многих системах письма, таких как тайский и деванагари, в настоящее время существует только два набора шестнадцатеричных цифр, и маловероятно, что будут добавлены другие. Это связано с тем, что вам нужны не только десять цифр, но и шесть [A-F] (и [a-f]) для соответствия. Это означает, что только латинский алфавит подходит для этого, а Юникод имеет только два набора таких цифр: знакомый набор ASCII и полные формы с шириной в два символа, начиная с U+FF10 (ШЕСТНАДЦАТЕРИЧНАЯ ЦИФРА НОЛЬ).

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

Оба аналога \p всегда предполагают, что действуют правила Юникода. На платформах 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, это соответствует только символам табуляции и пробела платформы.

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

Класс 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, либо полный диапазон Юникод, в зависимости от различных факторов, как описано в "Какой модификатор набора символов применяется?" в 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{} и сопоставляется с кодовой точкой, не относящейся к Юникоду, может быть выдано предупреждение, поскольку результат не определен Юникодом. Такого предупреждения не будет при использовании этой расширенной формы.

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

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

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

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

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

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

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

  1. Когда компилируется в области use locale (или модификатора регулярных выражений /l), этот конструкт предполагает, что локаль во время выполнения будет UTF-8, и сгенерированный шаблон всегда использует правила Юникода. Соответствие или его отсутствие, таким образом, не зависит от фактической локали во время выполнения, поэтому не активируется загрязнение. Но предупреждение категории 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–2023 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.38.0/perlrecharclass

Spec-Zone.ru

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