Модификатор /a в регулярных выражениях Perl

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

Добавление модификатора /a меняет поведение \d, \w и \s:

  • Если модификатор /a не указан, то эти наборы включают в себя множество символов из Unicode.
  • При наличии модификатора /a, эти наборы символов включают в себя только символы из диапазона ASCII

Так же меняется поведение \D, \W и \S.

\d

При указании модификатора /a набор символов \d включает в себя только 10 символов — цифры от 0 до 9. Если модификатор /a не указан, то \d означает все множество символов, которые являются цифрами в Unicode.

Вот пример кода:

▶ Run
#!/usr/bin/perl

use utf8;
use open qw(:std :utf8);
use strict;
use warnings;

my $str = '٢4௪၂၃';

if ($str =~ /(\d+)/) {
    print $1;
}

Программа выведет на экран то что было захвачено с помощью \d+ и это будет текст ٢4௪၂၃. В этом коде модификатор /a не указан, и поэтому \d захватывает все что считается цифрой в Unicode, а это не только 10 цифр от 0 до 9, но и множество других символов, которые используются в разных языках.

Если в этот код добавить модификатор /a: if ($str =~ /(\d+)/a) {, то программа выведет на экран один символ — число 4, так как в этом случае \d означает только 10 символов.

Примеры символов, которые Perl считает Unicode цифрами можно выяснить с помощью такого кода:

▶ Run
#!/usr/bin/perl

use utf8;
use open qw(:std :utf8);
use strict;
use warnings;

foreach my $i (0..65535) {
    print chr($i) if chr($i) =~ /\d/;
}

\s

При использовании /a множество символов \s до версии Perl 5.18 включает в себя 5 символов, а начиная с версии Perl 5.18 включает в себя 6 символов:

  • "\t", chr(9), "\N{CHARACTER TABULATION}"
  • "\n", chr(10), "\N{LINE FEED}"
  • "\x0B", chr(11), "\N{LINE TABULATION}" — начиная с версии Perl 5.18
  • "\f", chr(12), "\N{FORM FEED}"
  • "\r", chr(13), "\N{CARRIAGE RETURN}"
  • ' ', chr(32), "\N{SPACE}"

Если модификатор /a не указан, то \s включает больше символов (те, которые являются пробельными символами в Unicode).

\w

При использовании /a множество символов \w включает в себя 63 символа и работает так же как [A-Za-z0-9_].

Если /a не использовать, то \w включает в себя больше 50 тысяч разных символов Unicode.

Версии Perl

Модификатор /a впервые появился в версии Perl 5.14. Если попытаться его использовать до 5.14, то будет ошибка и выполнение кода будет остановлено. Например, код 'abc' =~ /\w/a; на версии Perl 5.10 выдаст ошибку:

Bareword found where operator expected at script.pl line 3, near "/\w/a"
    (Missing operator before a?)
syntax error at script.pl line 3, near "/\w/a"
Execution of script.pl aborted due to compilation errors.

Другие статьи

Комментарии