Perl Language
Vanliga uttryck
Sök…
Matchande strängar
Operatören =~
försöker matcha ett reguljärt uttryck (separerat av /
) till en sträng:
my $str = "hello world";
print "Hi, yourself!\n" if $str =~ /^hello/;
/^hello/
är det verkliga reguljära uttrycket. ^
Är ett specialtecken som berättar det reguljära uttrycket att börja med början av strängen och inte matcha i mitten någonstans. Därefter försöker regexet hitta följande bokstäver i ordning h
, e
, l
, l
och o
.
Vanliga uttryck försöker matcha standardvariabeln ( $_
) om det är känt:
$_ = "hello world";
print "Ahoy!\n" if /^hello/;
Du kan också använda olika avgränsare om du föregår det vanliga uttrycket med operatören m
:
m~^hello~;
m{^hello};
m|^hello|;
Detta är användbart när du matchar strängar som inkluderar /
-tecknet:
print "user directory" if m|^/usr|;
Användning av \ Q och \ E i mönstermatchning
Vad som är mellan \ Q och \ E behandlas som vanliga tecken
#!/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";
}
}
Produktion
String = 'hello.it's.me': - general_match: MATCHED! - qe_match: MATCHED! String = 'hello/it's!me': - general_match: MATCHED! - qe_match: DID NOT MATCH!
Analysera en sträng med en regex
I allmänhet är det inte bra att använda ett vanligt uttryck för att analysera en komplex struktur . Men det kan göras. Till exempel kanske du vill läsa in data i bikuptabellen och fält separeras med komma men komplexa typer som array separeras med en "|". Filer innehåller poster med alla fält separerade med komma och komplex typ är i fyrkantig konsol. I så fall kan denna bit av engångs Perl vara tillräcklig:
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'
Du vill kolla in produktionen:
1,2, [3 | 4 | 5], 5,6, [7 | 8], [1 | 2 | 34], 5
Byt ut en sträng med reguljära uttryck
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