2010-11-13 22 views
21

Actualmente estoy aprendiendo acerca de 'eliminación de referencias' en Perl y necesitan su ayuda en la comprensión de lo que el '\' significa en la línea de abajo ..¿Qué significa "" en Perl?

$ra = \$a; 
+4

Si actualmente está aprendiendo de ello, ¿qué dicen sus libros y manuales? – Ether

+2

mis notas de clase no explicaron lo que significaba, lo que me llevó a buscar en google. no encontré una respuesta, así que lo pregunté aquí. – Roy

+1

@Roy: asegúrese de elegir una respuesta correcta. ☹ – tchrist

Respuesta

18

Ver perlop.

Unario "\" crea una referencia a lo que le sigue. Ver perlreftut y perlref. No confunda este comportamiento con el comportamiento de la barra diagonal inversa dentro de una cadena, aunque ambas formas sí transmiten la noción de que protege lo siguiente de la interpolación .

+4

En realidad, o crea varias referencias a las siguientes cosas en el contexto de la lista, * por ejemplo, * '@r = \\ (@ a,% b, & c)' y '@r = \ localtime'. – tchrist

+0

cuando hay barra invertida "\" en expresiones regulares o en cadena, se llama ESCAPE; de lo contrario, se llama REFERENCIA – jjpcondor

1

Crea una referencia a la variable en el lado derecho; algo así como un puntero en C (sin la aritmética del puntero) o un puntero en Java.

Consulte perldoc perlref para obtener más información sobre el tema.

Dereferentiation se realiza a través de $$a escalares, @$a para las matrices, etc.

+1

@tchrist Esta respuesta no es incorrecta. No te dice completamente qué es lo que hace, pero la pregunta no era "¿qué hace el operador en todos los casos?", Era "lo que el '\' significa en la línea de abajo". La línea siguiente era '$ ra = \ $ a;', y en esa línea crea una referencia a la variable en el lado derecho. La respuesta también señala un documento de referencia que explica completamente al operador. –

+0

@Chas. Owens: es una respuesta incompleta al título de esta pregunta. – tchrist

+0

Ach bien, supongo que en la línea '$ ra = \ $ a;' no se crea una referencia a la variable en el lado derecho; P – mfontani

4

La documentación de Perl es grande y profunda, lo utilizan temprano y con frecuencia. Puedo recomendar perldoc perlreftut, el tutorial de referencias perl o perldoc perlref para obtener más información. Luego perldoc perlintro y perldoc perltoc o perldoc perl para ver dónde ir desde allí.

Y sí, crea una referencia a la variable $ a y la almacena en la variable $ ra.

24

Como he escrito en otro lugar previamente ...

Unario \ crea una referencia a lo que le sigue. Utilizado en una lista, crea una lista de referencias.

No confunda este comportamiento con el comportamiento de la barra invertida dentro de una cadena, aunque ambas formas transmiten la noción vagamente negacional de proteger lo siguiente de la interpretación. Este parecido no es completamente accidental.

Puede crear una referencia a cualquier variable nombrada o subrutina con una barra diagonal inversa. También puede usarlo en un valor escalar anónimo como 7 o "camel", aunque a menudo no será necesario. Este operador funciona como el operador & (dirección de) en C o C⁺⁺- al menos a primera vista.

He aquí algunos ejemplos:

$scalarref = \$foo; 
$constref = \186_282.42; 
$arrayref = \@ARGV; 
$hashref = \%ENV; 
$coderef = \&handler; 
$globref = \*STDOUT; 

El operador barra invertida puede hacer más que producir una sola referencia. Generará una lista completa de referencias si se aplica a una lista.

Como se mencionó anteriormente, el operador de barra diagonal inversa se usa generalmente en un solo referente para generar una sola referencia, pero no tiene que ser así. Cuando se usa en una lista de referentes, produce una lista de referencias correspondientes. La segunda línea del siguiente ejemplo hace lo mismo que la primera línea, ya que la barra invertida se distribuye automáticamente en toda la lista.

@reflist = (\$s, \@a, \%h, \&f);  # List of four references 
@reflist = \($s, @a %h, &f);  # Same thing 

Si una lista entre paréntesis contiene exactamente una matriz o hachís, entonces todos sus valores se interpolan y las referencias a cada devueltos:

@reflist = \(@x);     # Interpolate array, then get refs 
@reflist = map { \$_ } @x;   # Same thing 

Esto también ocurre cuando hay paréntesis internos:

@reflist = \(@x, (@y));    # But only single aggregates expand 
@reflist = (\@x, map { \$_ } @y); # Same thing 

Si prueba esto con un hash, el resultado contendrá referencias a los valores (como era de esperar), pero las referencias a copias de las claves (como podría no esperar).

Dado que las divisiones de matriz y hash son realmente solo listas, puede hacer una barra diagonal inversa de una de ellas para obtener una lista de referencias. Cada una de las siguientes cuatro líneas hace exactamente lo mismo:

@envrefs = \@ENV{"HOME", "TERM"};   # Backslashing a slice 
@envrefs = \@ENV{ qw<HOME TERM> };  # Backslashing a slice 
@envrefs = \($ENV{HOME}, $ENV{TERM}); # Backslashing a list 
@envrefs = (\$ENV{HOME}, \$ENV{TERM}); # A list of two references 

Dado que las funciones pueden devolver las listas, se puede aplicar una barra invertida para ellos. Si usted tiene más de una función a llamar, primero interpolar los valores de retorno de cada función en una lista más grande y luego barra invertida todo el asunto:

@reflist = \fx(); 
@reflist = map { \$_ } fx();    # Same thing 

@reflist = \(fx(), fy(), fz()); 
@reflist = (\fx(), \fy(), \fz());   # Same thing 
@reflist = map { \$_ } fx(), fy(), fz(); # Same thing 

El operador barra invertida siempre suministra un contexto lista para su operando, por lo que esas funciones son todos llamados en el contexto de la lista. Si la barra invertida es en sí mismo en contexto escalar, que va a terminar con una referencia al último valor de la lista devuelta por la función:

@reflist = \localtime();  # Ref to each of nine time elements 
$lastref = \localtime();  # Ref to whether it’s daylight savings time 

En este sentido, la barra invertida se comporta como la lista de Perl llamado operadores , como print, reverse y sort, que siempre proporcionan un contexto de lista a su derecha sin importar lo que pueda estar pasando a su izquierda. Al igual que con los operadores de lista con nombre, utilice una explícita scalar a la fuerza lo que sigue en contexto escalar:

$dateref = \scalar localtime(); # \"Sat Nov 13 10:41:30 2010" 

Y ahora ya sabes ... el resto de la historia.

(con perdón de la tarde Paul Harvey)

+2

Acabo de utilizar una referencia a DATA con \\ * DATA para usar Template :: Toolkit con LaTeX. Puse la sección LaTeX en la sección DATA y luego usé la referencia a eso como la plantilla en 'process': Perl es genial. –

+2

También gracias por mostrar que \\ (...) se distribuye, creando una referencia a cada elemento. Hubiera supuesto que haría una referencia al conjunto de esa lista, pero ahora eso tiene sentido, de lo contrario, para qué [...] lo necesitaríamos. Gracias –

+1

que es muy completo, eso es tchrist. – Roy