2009-06-24 35 views
49

¿Qué significa $ 1 en Perl? Además, ¿qué significa $ 2? ¿Cuántas variables de $ number hay?

+1

¿Qué pasa si no había partido? – ojblass

+3

Es recomendable que revise algo como _Learning Perl_ u otra introducción a Perl que explique los conceptos básicos del lenguaje. –

+0

Ahora Brian, ¿por qué recomendarías ese libro? Los Monjes son una organización benéfica después de todo ... –

Respuesta

55

Los $number variables contienen las partes de la cadena que se correspondía con la capture groups(...) en el patrón para su último partido de expresiones regulares si el partido se ha realizado correctamente.

Por ejemplo, tomemos la siguiente cadena:

$text = "the quick brown fox jumps over the lazy dog."; 

Después de la declaración

$text =~ m/ (b.+?) /; 

$1 es igual al texto "brown".

+3

Capturas, no agrupaciones. –

+1

¿Qué pasa si hay más de una coincidencia? ¿Podemos de alguna manera obtener todos los partidos? – user1289

31

Las variables numéricas son los partidos de la última éxito partido o sustitución del operador que solicitó:

my $string = 'abcdefghi'; 

if($string =~ /(abc)def(ghi)/) { 
    print "I found $1 and $2\n"; 
    } 

Compruebe siempre que el combate o la sustitución se ha realizado correctamente antes de usar $ 1 y así sucesivamente. De lo contrario, podría recoger los restos de otra operación.

Las expresiones regulares de Perl están documentadas en perlre.

+0

Si siempre hay $ 1 a $ 9, ¿qué valor hay si hay menos de nueve partidos? –

+3

$ 1 a $ 9 no siempre están ahí. Creo que Jim leyó mal la página del hombre. Cito la sección relevante: "Puede tener tantos paréntesis como desee. Si tiene más de 9 subcadenas, las variables $ 10, $ 11, ... se refieren a la subcadena correspondiente. Dentro del patrón, \ 10, \ 11 , etc. remite a las subcadenas si ha habido al menos tantos paréntesis izquierdos antes de la retro-referencia. De lo contrario (para compatibilidad con versiones anteriores) \ 10 es lo mismo que \ 010, un retroceso, y \ 11 lo mismo que \ 011, una pestaña . Y así sucesivamente. (\ 1 a \ 9 son siempre referencias atrás.) " –

+2

-1 para demasiadas medias verdades. Son el resultado de capturas, no del partido en conjunto. Solo están configurados en partidas exitosas, lo que significa que debes comprobar si la coincidencia fue exitosa o no antes de usarlas.Como ya ha señalado Alan, ha confundido el comportamiento de casos especiales de la notación invertida alternada. –

6

Estos se denominan "Variables de coincidencia". Como se mencionó anteriormente, contienen el texto de su última coincidencia de expresión regular.

Más información aquí: http://cslibrary.stanford.edu/108/EssentialPerl.html

(CTRL-F para 'Concordancia Variables' para encontrar la sección correspondiente)

0

Las variables $ 1 .. $ 9 también son de sólo lectura variables, de modo que no puede asignar implícitamente una valor para ellos:

$1 = 'foo'; print $1;

que devolverá un error: la modificación de un valor de sólo lectura intento en la línea de secuencia de comandos 1.

Tampoco puede usar números para el comienzo de nombres de variables:

$1foo = 'foo'; print $1foo;

Lo anterior también arrojará un error.

7

Como otros han señalado las $ x son variables de captura para expresiones regulares que le permiten hacer referencia a secciones de un patrón coincidente.

Perl también es compatible con las capturas con nombre, lo que podría ser más fácil de recordar para los humanos en algunos casos.

entrada dada: 111 222

/(\d+)\s+(\d+)/ 

$ 1 es 111

$ 2 es 222

Se podría decir también:

/(?<myvara>\d+)\s+(?<myvarb>\d+)/ 

$ + {myvara} es 111

$ + {myvarb} es 222

11

$ 1, $ 2, etc contendrá el valor de las capturas del último partido éxito - es importante comprobar si el partido tuvo éxito antes de acceder a ellos, es decir

if ($var =~ m/()/) { # use $1 etc... } 

un ejemplo del problema - $ 1 contiene 'rápida' en ambas declaraciones de impresión a continuación:

#!/usr/bin/perl 

'Quick brown fox' =~ m{ (quick) }ix; 
print "Found: $1\n"; 

'Lazy dog' =~ m{ (quick) }ix; 
print "Found: $1\n"; 
0

sospecharía que no puede haber tantos como 2**32 -1 variables de comparación numeradas, en un compilado de 32 bits binarios Perl.

2

En cuestiones generales relacionadas con las variables "mágicas" en Perl pueden ser respondidas por buscar en la documentación de las variables predefinidas Perl a la:

perldoc perlvar 

Sin embargo, al buscar esta documentación por $ 1, etc. Encontrará referencias en varios lugares excepto en la sección sobre estas variables de "dígitos". Usted tiene que buscar

$<digits> 

yo hubiera añadido este a Brian's answer ya sea comentando o la edición, pero no tengo representante suficiente. Si alguien agrega esto, eliminaré esta respuesta.

1

Ya que pidió a los grupos de captura, puede que desee saber sobre $ + también .. Bastante útil ..

use Data::Dumper; 
$text="hiabc ihabc ads byexx eybxx"; 
while($text=~/(hi|ih)abc|(bye|eyb)xx/igs) 
{ 
    print Dumper $+; 
} 

OUTPUT:
$VAR1 = 'hi';
$VAR1 = 'ih';
$VAR1 = 'bye';
$VAR1 = 'eyb';

Cuestiones relacionadas