Estoy empezando a aprender Perl y quería saber la diferencia entre paréntesis para capturar y retroceder referencias en Perl, y ¿en qué situaciones sería más útil cada una?

Cuando digo paréntesis para capturar, me refiero a algo como lo siguiente:

if ($email =~ /([^@]+)@(.+)/) {
    print "Username is $1\n";
    print "Hostname is $2\n";
}

Cuando digo referencia inversa, me refiero a algo como lo siguiente:

# (.)\1
# (.) = capture group; \1 = reference group
# (.)(.)\2\1; This pattern has 2 capture groups
# (.)(.)\g{2}\g{1}; This pattern is safer. Can't be confused w/ digits

Si mi sintaxis es incorrecta con la referencia inversa, hágamelo saber porque no estoy 100% seguro de cómo funciona la sintaxis para la referencia inversa.

2
pHorseSpec 26 ene. 2016 a las 00:58

3 respuestas

La mejor respuesta

Una parte de un patrón de expresiones regulares entre paréntesis será capturado si el patrón en su totalidad coincide. Es irrelevante cómo se usa esa subcadena capturada. Las capturas se numeran comenzando desde 1 de izquierda a derecha en el orden en que aparecen sus paréntesis de apertura en el patrón de expresiones regulares

  • Puede usarse como una referencia inversa más adelante dentro del mismo patrón usando la secuencia \1 etc. o (preferiblemente) \g1 etc.

  • Puede usarse fuera del patrón como un valor de cadena simple $1, etc., ya sea en la parte de reemplazo de una sustitución o en el código Perl posterior.

Puede utilizar la cadena capturada de ambas formas a la vez, por ejemplo

say $1 if $str =~ /(.)\g1/;

Tenga en cuenta que si el patrón no coincide, el valor de $1 será sin cambios de la coincidencia exitosa más reciente, por lo que cualquier uso de $1 etc. debe estar condicionado a coincidencia exitosa del patrón del que se va a extraer

4
Borodin 26 ene. 2016 a las 01:29

No hay diferencia. Ni siquiera hay dos cosas que se comparen dos. Solo hay (...).

Se puede utilizar como referencia inversa. \1 es un átomo de expresión regular que coincide con lo que capturó la primera captura. Esto solo se puede usar en patrones de expresión regular.

Se puede utilizar para capturar. $1 es una variable de Perl que contiene lo que capturó la primera captura. Esto solo se puede usar en código Perl.

1
ikegami 5 feb. 2016 a las 22:13

No hay diferencia. Captura de paréntesis (a menos que sea una de las construcciones (?...)). Puede utilizar el texto capturado como referencia inversa o con variables de captura ($1) (o ambas).

2
cjm 25 ene. 2016 a las 22:16