Perl Language
Wyrażenia regularne
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