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


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow