Perl Language
Espressioni regolari
Ricerca…
Stringhe corrispondenti
L'operatore =~
tenta di far corrispondere un'espressione regolare (separata da /
) a una stringa:
my $str = "hello world";
print "Hi, yourself!\n" if $str =~ /^hello/;
/^hello/
è l'espressione regolare attuale. Il ^
è un personaggio speciale che dice all'espressione regolare di iniziare con l'inizio della stringa e non corrispondere nel mezzo da qualche parte. Quindi la regex tenta di trovare le seguenti lettere in ordine h
, e
, l
, l
e o
.
Le espressioni regolari tentano di far corrispondere la variabile predefinita ( $_
) se nuda:
$_ = "hello world";
print "Ahoy!\n" if /^hello/;
È inoltre possibile utilizzare diversi delimitatori se si precede l'espressione regolare con l'operatore m
:
m~^hello~;
m{^hello};
m|^hello|;
Questo è utile quando si confrontano stringhe che includono il carattere /
:
print "user directory" if m|^/usr|;
Utilizzo di \ Q e \ E nella corrispondenza del modello
Quello che c'è tra \ Q e \ E viene trattato come caratteri normali
#!/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";
}
}
Produzione
String = 'hello.it's.me': - general_match: MATCHED! - qe_match: MATCHED! String = 'hello/it's!me': - general_match: MATCHED! - qe_match: DID NOT MATCH!
Analisi di una stringa con un'espressione regolare
In genere, non è una buona idea usare un'espressione regolare per analizzare una struttura complessa . Ma può essere fatto. Ad esempio, potresti voler caricare i dati nella tabella hive e i campi sono separati da virgola, ma tipi complessi come la matrice sono separati da un "|". I file contengono record con tutti i campi separati da virgola e il tipo complesso è racchiuso tra parentesi quadre. In tal caso, questo bit di Perl usa e getta potrebbe essere sufficiente:
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'
Ti consigliamo di verificare l'output:
1,2, [3 | 4 | 5], 5,6, [7 | 8], [1 | 2 | 34], 5
Sostituisci una stringa usando le espressioni regolari
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