Modyfikator /a w wyrażeniach regularnych Perla

Przy użyciu wyrażeń regularnych w Perlu można wykorzystać modyfikator /a.

Dodanie modyfikatora /a zmienia zachowanie \d, \w i \s:

  • Jeśli modyfikator /a nie jest określony, zestawy te obejmują wiele znaków Unicode.
  • W obecności modyfikatora /a, te zestawy znaków obejmują tylko znaki z zakresu ASCII

Tak samo zmienia się zachowanie \D, \W i \S.

\d

Po określeniu modyfikatora /a zestaw znaków \d zawiera tylko 10 znaków — cyfry od 0 do 9. Jeśli modyfikator /a nie jest określony, \d oznacza wszystkie wiele znaków, które są cyframi w formacie Unicode.

Oto przykład kodu:

▶ Run
#!/usr/bin/perl

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

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

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

Program wypisze na ekran to, co było chwyta za pomocą \d+ i to będzie tekst ٢4௪၂၃. W tym kodzie modyfikator /a nie jest określony, dlatego \d chwyta wszystko co jest cyfrą w Unicode, a nie tylko 10 cyfr od 0 do 9, ale i wiele innych znaków, które są używane w różnych językach.

Jeśli ten kod dodać modyfikator /a: if ($str =~ /(\d+)/a) {, program wyświetla jeden znak — liczba 4, tak jak w tym przypadku \d oznacza tylko 10 znaków.

Przykłady znaków, które Perl uważa Unicode cyfry można dowiedzieć się z pomocą takiego kodu:

▶ 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

Podczas korzystania z /a wiele znaków \s do wersji Perl 5.18 składa się z 5 znaków, a od wersji Perl 5.18 zawiera 6 znaków:

  • "\t", chr(9), "\N{CHARACTER TABULATION}"
  • "\n", chr(10), "\N{LINE FEED}"
  • "\x0B", chr(11), "\N{LINE TABULATION}" — począwszy od wersji Perl 5.18
  • "\f", chr(12), "\N{FORM FEED}"
  • "\r", chr(13), "\N{CARRIAGE RETURN}"
  • ' ', chr(32), "\N{SPACE}"

Jeśli modyfikator /a nie jest określony, \s zawiera więcej znaków (te które są пробельными znaków w Unicode).

\w

Podczas korzystania z /a wiele znaków \w zawiera 63 znaków i działa tak samo jak [A-Za-z0-9_].

Jeśli /a nie używać, to \w zawiera ponad 50 tysięcy różnych znaków Unicode.

W Wersji Perl

Modyfikator /a po raz pierwszy pojawił się w wersji Perl 5.14. Jeśli spróbujesz go użyć do 5.14, to będzie błąd i wykonywanie kodu zostanie zatrzymane. Na przykład, kod 'abc' =~ /\w/a; w wersji Perl 5.10 wyświetli błąd:

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.

Inne artykuły