Perl Language
Expresiones regulares
Buscar..
Cuerdas a juego
El operador =~
intenta hacer coincidir una expresión regular (separada por /
) con una cadena:
my $str = "hello world";
print "Hi, yourself!\n" if $str =~ /^hello/;
/^hello/
es la expresión regular real. ^
Es un carácter especial que le dice a la expresión regular que comience con el principio de la cadena y que no coincida en el medio en algún lugar. Luego, la expresión regular trata de encontrar las siguientes letras en orden h
, e
, l
, l
y o
.
Las expresiones regulares intentan coincidir con la variable predeterminada ( $_
) si están vacías:
$_ = "hello world";
print "Ahoy!\n" if /^hello/;
También puede usar diferentes delimitadores si precede la expresión regular con el operador m
:
m~^hello~;
m{^hello};
m|^hello|;
Esto es útil cuando se combinan cadenas que incluyen el carácter /
:
print "user directory" if m|^/usr|;
Uso de \ Q y \ E en la coincidencia de patrones
Lo que está entre \ Q y \ E se trata como caracteres normales
#!/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";
}
}
Salida
String = 'hello.it's.me': - general_match: MATCHED! - qe_match: MATCHED! String = 'hello/it's!me': - general_match: MATCHED! - qe_match: DID NOT MATCH!
Analizar una cadena con una expresión regular
En general, no es una buena idea usar una expresión regular para analizar una estructura compleja . Pero puede hacerse. Por ejemplo, es posible que desee cargar datos en la tabla de la sección y los campos estén separados por comas, pero los tipos complejos como la matriz están separados por una "|". Los archivos contienen registros con todos los campos separados por comas y los tipos complejos están dentro de corchetes. En ese caso, este bit de Perl desechable podría ser suficiente:
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'
Querrás ver el resultado:
1,2, [3 | 4 | 5], 5,6, [7 | 8], [1 | 2 | 34], 5
Reemplace una cadena usando expresiones regulares
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