Spec-Zone.ru › Perl 5.28

perlrecharclass

СОДЕРЖАНИЕ

  • НАЗВАНИЕ
  • ОПИСАНИЕ
    • Точка
    • Последовательности с обратной косой чертой
      • \N
      • Цифры
      • Символы слова
      • Пробелы
      • Свойства Юникода
        • Примеры
    • Классы символов в квадратных скобках
      • Специальные символы внутри класса символов в квадратных скобках
      • Классы символов в квадратных скобках и модификатор шаблона /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). Приложение, которое ожидает только ASCII-цифры, может быть введено в заблуждение, или если совпадение — \d+, сопоставленная строка может содержать смесь цифр из разных систем письма, которые выглядят так, как будто они обозначают число, отличное от фактического. "num()" в Unicode::UCD может использоваться для безопасного вычисления значения, возвращая undef если входная строка содержит такую смесь.

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

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

Тамильские цифры (U+0BE6 - U+0BEF) также могут законно использоваться в тамильских числах старой формы, в которых они появляются не более одного подряд, разделённые символами, обозначающими «умножить на 10», «умножить на 100» и т. д. (См. http://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 соответствует символу подчёркивания платформы плюс чему угодно, что локаль считает буквенно-цифровым.

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

\w точно соответствует тому, что \p{Word} соответствует.

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

\w соответствует [a-zA-Z0-9_].

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

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

Кроме того, для несколько более подробного набора символов, которые находятся в идентификаторах языков программирования за пределами диапазона ASCII, вы можете вместо этого использовать более настраиваемые "Свойства Юникода", \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] ниже для обсуждения этого.) Обратите внимание, что этот список не включает неразрывный пробел.

Применяемые правила определяются, как описано в "В какой кодовой таблице выполняются настройки?" в 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 по состоянию на Юникод 6.3.

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

Для получения дополнительной информации о свойствах Юникода см. "Свойства символов Юникода" в perlunicode; для получения полного списка возможных свойств см. "Свойства, доступные через \p{} и \P{}" в perluniprops, который отмечает все формы, имеющие /i различия. Также возможно определить собственные свойства. Это обсуждается в "Пользовательские свойства символов" в perlunicode.

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

До версии v5.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

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

Примеры
"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: 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

Обычно символы SPACE и TAB не имеют специального значения внутри скобочного класса символов; они просто добавляются в список символов, сопоставляемых классом. Но если модификатор шаблона /xx активен, они обычно игнорируются и могут быть добавлены для повышения читаемости. Их нельзя добавлять в середину отдельного конструкта:

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

Пробел посередине шестнадцатеричной константы недопустим.

Чтобы указать литеральный символ SPACE, вы можете экранировать его с помощью обратной косой черты, как:

/[ a e i o u \  ]/xx

Это соответствует английским гласным плюс символу SPACE.

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

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

Часто требуется сопоставить диапазон символов. К счастью, вместо перечисления всех символов в диапазоне можно использовать дефис (-). Если внутри скобочного класса символов есть два символа, разделенные дефисом, то это обрабатывается так, как будто все символы между ними находятся в классе. Например, [0-9] соответствует любой десятичной цифре, а [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 ("[A-Za-z]").
alnum  Any alphanumeric character ("[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 ("[0-9]"), equivalent to "\d".
graph  Any printable character, excluding a space.  See Note [3] below.
lower  Any lowercase character ("[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 ("[A-Z]").
word   A Perl extension ("[A-Za-z0-9_]"), equivalent to "\w".
xdigit Any hexadecimal digit ("[0-9a-fA-F]").

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

У большинства POSIX-классов символов есть два аналога свойств в стиле Unicode \p. (Они не являются официальными свойствами 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}
[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.

Существует множество других синонимов, которые можно использовать помимо перечисленных в таблице. Например, \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.

Предлагается изменить это поведение в будущей версии Perl, чтобы правила Unicode не влияли на поведение: вне локали классы POSIX будут вести себя как их аналоги в диапазоне ASCII. Если вы хотите прокомментировать это предложение, отправьте электронное письмо по адресу perl5-porters@perl.org.

Отрицание классов символов 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} ])/

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

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

no warnings "experimental::regex_sets";

Комментарии к этой функции приветствуются; отправьте письмо по адресу perl5-porters@perl.org.

Правила, используемые 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. Таким образом, соответствие или его отсутствие не зависят от фактической локали во время выполнения, поэтому загрязнение (tainting) не включено. Однако, если локаль во время выполнения окажется не UTF-8, будет поднято предупреждение категории locale.

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

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

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

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

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

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

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

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

my $thai_or_lao = '( \p{Thai} + \p{Lao} )';

Но любые модификаторы всё ещё будут применяться ко всем составляющим:

my $lower = '\p{Lower} + \p{Digit}';
qr/(?[ \p{Greek} & $lower ])/i;

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

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

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

Из-за того, как Perl анализирует вещи, вам может потребоваться соблюдать баланс скобок и квадратных скобок, включая комментарии. Если вы столкнётесь с какими-либо примерами, пожалуйста, отправьте их на perlbug@perl.org, чтобы мы могли получить конкретный пример для этой страницы руководства.

Мы можем изменить это таким образом, что вещи, которые остаются допустимыми использованиями в обычных символьных классах в квадратных скобках, могут стать недопустимыми в рамках этого экспериментального конструкта. Например, одно из предложений – запретить смежные использования одного и того же символа, как в (?[ [aa] ]). Мотивация такого изменения состоит в том, что это, скорее всего, опечатка, так как второй «а» ничего не добавляет.

© 1993–2020 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.28.3/perlrecharclass

Spec-Zone.ru

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