Las variables $<digito> y $+
Cuando en el interior de una expresión regular hay subexpresiones entre paréntesis, Las subcadenas coincidentes con ellas se asignan a las variables $1, $2, $3,… hasta $9.
Por otra parte, $+ representa la subcadena coincidente con la última subexpresión entre paréntesis
Ejemplo:
my $cadena = "Esta cadena tiene varias palabras, una fecha 2013-01-27 y el número 123";
if ($cadena =~ m/^.* cadena ([^ ]*) .* (2013[^ ]*) (.*)$/) {
print "La palabra que sigue a "cadena" es: " . $1 . "n";
print "La fecha es: " . $2 . "n";
print "El resto del texto tras la fecha es: " . $3 . "n";
print "La última coincidencia entre paréntesis es: " . $+ . "n";
}
Las sentencias del ejemplo generan la salida:
La palabra que sigue a "cadena" es: tiene La fecha es: 2013-01-27 El resto del texto tras la fecha es: y el número 123
Las variables $`, $& y $’
La variable $& contiene la última coincidencia (match) encontrada al evaluar una expresión regular.
La variable $` el texto precedente a la coincidencia (prematch)
La variable $’ contiene el texto que sigue a la coincidencia (postmatch).
Así, el siguiente ejemplo:
my $cadena = "Esta cadena tiene varias palabras, una fecha 2013-01-27 y el número 123";
if ($cadena =~ m/2013[^ ]*/) {
print "Prematch: " . $` . "n";
print "Match: " . $& . "n";
print "Postmatch: " . $' . "n";
}
Genera la siguiente salida:
Prematch: Esta cadena tiene varias palabras, una fecha Match: 2013-01-27 Postmatch: y el número 123 La última coincidencia entre paréntesis es: y el número 123
Las variables ${^MATCH}, ${^PREMATCH} y ${^POSTMATCH}
Por razones de implementación del intérprete perl, el uso de las variables $`, $& y $’ en cualquier parte de un script provoca una considerable degradación del rendimiento en el proceso de todas las expresiones regulares.
Para evitar este problema, se pueden utilizar en su lugar las variables ${^MATCH}, ${^PREMATCH} y ${^POSTMATCH}, siempre que se utilize además el modificador “/p”. Así, el ejemplo anterior se puede sustituir por:
my $cadena = "Esta cadena tiene varias palabras, una fecha 2013-01-27 y el número 123";
if ($cadena =~ m/2013[^ ]*/p) {
print "Prematch: " . ${^PREMATCH} . "n";
print "Match: " . ${^MATCH} . "n";
print "Postmatch: " . ${^POSTMATCH} . "n";
}
Las variables @- y @+
@- y @+ son arrays que contienen los índices al comienzo y final de cada una de las subcadenas coincidentes en una expresión regular.
@-[0] y @+[0] son los índices a la subcadena coincidente con la expresión regular completa, y las siguientes entradas en estos arrays son los índices a las subexpresiones regulares en el interior de la expresión regular.
Por ejemplo, el siguiente código:
my $cadena = "Esta cadena tiene varias palabras, una fecha 2013-01-27 y el número 123";
if ($cadena =~ m/cadena ([^ ]*) .* (2013[^ ]*) /) {
print "La palabra que sigue a "cadena" es: " . $1 . "n";
print "La fecha es: " . $2 . "n";
print "El resto del texto tras la fecha es: " . $3 . "n";
print '$-[0]: ' . $-[0] . ', $+[0]: ' . $+[0] . "n";
print "subcadena(" . $-[0] . "," . $+[0] . "): " . substr($cadena, $-[0], $+[0]-$-[0]) . "n";
print '$-[1]: ' . $-[1] . ', $+[1]: ' . $+[1] . "n";
print "subcadena(" . $-[1] . "," . $+[1] . "): " . substr($cadena, $-[1], $+[1]-$-[1]) . "n";
print '$-[2]: ' . $-[2] . ', $+[2]: ' . $+[2] . "n";
print "subcadena(" . $-[2] . "," . $+[2] . "): " . substr($cadena, $-[2], $+[2]-$-[2]) . "n";
}
Da como resultado:
$-[0]: 5, $+[0]: 56 subcadena(5,56): cadena tiene varias palabras, una fecha 2013-01-27 $-[1]: 12, $+[1]: 17 subcadena(12,17): tiene $-[2]: 45, $+[2]: 55 subcadena(45,55): 2013-01-27
Las variables %+ y %-
En una expresión regular, a una subexpresión entre paréntesis (…) es posible asignarle un nombre usando la sintaxis (?<nombre>…).
El hash %+ permite acceder a cada una de las subcadenas coincidentes con las subexpresiones entre paréntesis a las que se ha asignado un nombre.
Ejemplo:
my $cadena = "Esta cadena tiene varias palabras, una fecha 2013-01-27 y el número 123";
if ($cadena =~ m/^.* cadena (?<palabra>[^ ]*) .* (?<fecha>2013[^ ]*) (?<resto>.*)$/) {
print "La palabra que sigue a "cadena" es: " . $+{palabra} . "n";
print "La fecha es: " . $+{fecha} . "n";
print "El resto del texto tras la fecha es: " . $+{resto} . "n";
La variable %- es similar a %+, pero sus valores son arrays. Cada uno de los arrays contiene todas las subcadenas coincidentes para un mismo nombre asignado.
Ejemplo:
my $cadena = "Esta cadena tiene varias palabras, una fecha 2013-01-27 y el número 123";
if ($cadena =~ m/^.* cadena (?<dato>[^ ]*) .* (?<dato>2013[^ ]*) (?<dato>.*)$/) {
print "La palabra que sigue a "cadena" es: " . $-{dato}[0] . "n";
print "La fecha es: " . $-{dato}[1] . "n";
print "El resto del texto tras la fecha es: " . $-{dato}[2] . "n";
La variable $^N
Esta variable especial contiene la cadena coincidente con la última expresión entre paréntesis, y se utiliza principalemente en expresiones de la forma (?{ $variable = $^N}) para asignar la subcadena a una variable
Ejemplo:
my $cadena = "Esta cadena tiene varias palabras, una fecha 2013-01-27 y el número 123";
my $palabra;
if ($cadena =~ m/^.* cadena ([^ ]*)(?{$palabra = $^N}) .* (?<dato>2013[^ ]*) (?<dato>.*)$/) {
print "La palabra que sigue a "cadena" es: " . $palabra . "n";
print "La fecha es: " . $-{dato}[0] . "n";
print "El resto del texto tras la fecha es: " . $-{dato}[1] . "n";
}
En este ejemplo, el resultado de evaluar la primera expresión entre paréntesis “([^ ]*)” es asignado a la variable “$palabra”.
—