Szukaj…


Dopasowane ciągi

Operator =~ próbuje dopasować wyrażenie regularne (oddzielone przez / ) do łańcucha:

my $str = "hello world";
print "Hi, yourself!\n" if $str =~ /^hello/;

/^hello/ jest właściwym wyrażeniem regularnym. ^ Jest znakiem specjalnym, który mówi wyrażeniu regularnemu, aby zaczynało się od początku łańcucha i nie pasowało gdzieś pośrodku. Następnie wyrażenie regularne próbuje znaleźć następujące litery w kolejności h , e , l , l i o .

Wyrażenia regularne próbują dopasować zmienną domyślną ( $_ ), jeśli są puste:

$_ = "hello world";

print "Ahoy!\n" if /^hello/;

Możesz także użyć różnych ograniczników, jeśli poprzedzasz wyrażenie regularne operatorem m :

m~^hello~;
m{^hello}; 
m|^hello|;

Jest to przydatne podczas dopasowywania ciągów zawierających znak / :

print "user directory" if m|^/usr|;

Użycie \ Q i \ E w dopasowaniu wzorca

To, co pomiędzy \ Q i \ E jest traktowane jak normalne znaki

#!/usr/bin/perl

my $str = "hello.it's.me";

my @test = (
  "hello.it's.me",
    "hello/it's!me",
    );

sub ismatched($) { $_[0] ? "MATCHED!" : "DID NOT MATCH!" }

my @match = (
      [ general_match=> sub { ismatched /$str/ } ],
      [ qe_match    => sub { ismatched /\Q$str\E/ } ],
      );

for (@test) {
    print "\String = '$_':\n";

foreach my $method (@match) {
    my($name,$match) = @$method;
    print "  - $name: ", $match->(), "\n";
}

}

Wynik

String = 'hello.it's.me':
  - general_match: MATCHED!
  - qe_match: MATCHED!
String = 'hello/it's!me':
  - general_match: MATCHED!
  - qe_match: DID NOT MATCH!

Analizowanie ciągu za pomocą wyrażenia regularnego

Ogólnie rzecz biorąc, nie jest dobrym pomysłem stosowanie wyrażenia regularnego do analizowania złożonej struktury . Ale można to zrobić. Na przykład możesz chcieć załadować dane do tabeli gałęzi, a pola są oddzielone przecinkiem, ale typy złożone, takie jak tablica, są oddzielone znakiem „|”. Pliki zawierają rekordy ze wszystkimi polami oddzielonymi przecinkiem, a typ złożony jest w nawiasie kwadratowym. W takim przypadku ten jednorazowy Perl może być wystarczający:

echo "1,2,[3,4,5],5,6,[7,8],[1,2,34],5" | \
    perl -ne \
        'while( /\[[^,\]]+\,.*\]/ ){
            if( /\[([^\]\|]+)\]/){
                $text = $1;
                $text_to_replace = $text;
                $text =~ s/\,/\|/g;
                s/$text_to_replace/$text/;
            }
        } print'

Będziesz chciał na miejscu sprawdzić wyjście:

1,2, [3 | 4 | 5], 5,6, [7 | 8], [1 | 2 | 34], 5

Zamień ciąg przy użyciu wyrażeń regularnych

s/foo/bar/;         # replace "foo" with "bar" in $_
my $foo = "foo";
$foo =~ s/foo/bar/; # do the above on a different variable using the binding operator =~
s~ foo ~ bar ~;     # using ~ as a delimiter
$foo = s/foo/bar/r; # non-destructive r flag: returns the replacement string without modifying the variable it's bound to
s/foo/bar/g;        # replace all instances


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow