Variables especiales después de un emparejamiento

Despues de un emparejamiento con éxito, las siguientes variables especiales quedan definidas:



$& El texto que casó
$` El texto que está a la izquierda de lo que casó
$' El texto que está a la derecha de lo que casó
$1, $2, $3, etc. Los textos capturados por los paréntesis
$+ Una copia del $1, $2, ...con número mas alto
@- Desplazamientos de las subcadenas que casan en $1 ...
@+ Desplazamientos de los finales de las subcadenas en $1 ...
$#- El índice del último paréntesis que casó
$#+ El índice del último paréntesis en la última expresión regular



Ejemplo:

   1 #!/usr/bin/perl -w
   2 if ("Hello there, neighbor" =~ /\s(\w+),/) {
   3   print "That was: ($`)($&)($').\n",
   4 }

> matchvariables.pl
That was: (Hello)( there,)( neighbor).

La variable $+ contiene el texto que casó con el último paréntesis en el patrón. Esto es útil en situaciones en las cuáles una de un conjunto de alternativas casa, pero no sabemos cuál:

/Version: (.*)|Revision: (.*)/ && ($rev = $+);

El vector @- contiene los offsets o desplazamientos de los casamientos en la última expresión regular. La entrada $-[0] es el desplazamiento del último casamiento con éxito y $-[n] es el desplazamiento de la subcadena que casa con el n-ésimo paréntesis (o undef si el párentesis no casó). Por ejemplo:

DB<1> $z = "hola13.47"
DB<2> if ($z =~ m{a(\d+)(\.(\d+))?}) { print "@-\n"; }
3 4 6 7

El array @+ contiene los desplazamientos de los finales de los emparejamientos. La entrada $+[0] contiene el desplazamiento del final de la cadena del emparejamiento completo. Siguiendo con el ejemplo anterior:

DB<3> if ($z =~ m{a(\d+)(\.(\d+))?}) { print "@+\n"; }
9 6 9 9
Se puede usar $#+ para determinar cuantos subgrupos había en el último emparejamiento que tuvo éxito.
DB<4> if ($z =~ m{a(\d+)(\.(\d+))?}) { print "$#+\n"; }
3
DB<5> if ($z =~ m{(a)(\d+)(\.(\d+))?}) { print "$#+\n"; }
4

La variable $#- contiene el índice del último paréntesis que casó. Observe la siguiente ejecución con el depurador:

  DB<1> $x = '13.47'; $y = '125'
  DB<2> if ($y =~ m{(\d+)(\.(\d+))?}) { print "last par = $#-, content = $+\n"; }
last par = 1, content = 125
  DB<3> if ($x =~ m{(\d+)(\.(\d+))?}) { print "last par = $#-, content = $+\n"; }
last par = 3, content = 47

Para saber más sobre las variables especiales disponibles consulte perldoc perlvar.

Casiano Rodríguez León
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19