2009-10-29 14 views
9

en Perl 5.8.5, si hago lo siguiente, no me sale un error:¿Por qué un valor undef se convierte en una referencia de matriz válida en Perl?

use strict; 

my $a = undef; 
foreach my $el (@$a) { 
    ...whatever 
} 

¿Qué está pasando aquí? Al imprimir la salida de ref($a), se muestra que $a cambia para convertirse en una referencia de matriz válida en algún momento. Pero nunca configuré explícitamente $a a nada.

Parece un poco extraño que el contenido de una variable pueda cambiar sin que yo haga nada.

Pensamientos, ¿alguien?

EDITAR: Sí, sé todo sobre la auto-vivificación. Siempre pensé que tenía que haber una tarea en algún punto del camino para activarla, no solo una referencia.

+3

Esto es perl. La rareza está bien, porque es extraña. –

+3

No creo que sea extraño, solo una conveniencia para guardar algunas declaraciones. –

+3

@Stefano: ¿por qué molestarse en consultar las preguntas de Perl solo para troll? Es tedioso ... – Telemachus

Respuesta

11

Leer Uri Guttman's article on autovivification.

No hay nada extraño al respecto una vez que lo conoces y ahorra mucha incomodidad.

Perl first evaluates a dereference expression and sees that the current reference value is undefined. It notes the type of dereference (scalar, array or hash) and allocates an anonymous reference of that type. Perl then stores that new reference value where the undefined value was stored. Then the dereference operation in progress is continued. If you do a nested dereference expression, then each level from top to bottom can cause its own autovivication.

+0

Pregunta de seguimiento. ¿Por qué esto no se auto-vivifica: 'mi $ a; mi @x = @ $ a'? – FMc

+4

@FM: en general, las cosas que solo leen desde una referencia no se autoverificarán, mientras que las cosas que pueden modificar lo que se desreferenciarán. El bucle for es un ejemplo de algo que puede modificarse (ya que $ el es un alias en la matriz y la matriz puede cambiarse a través de ella). Sin embargo, esta es solo una regla suelta; hay algunos bordes ásperos. – ysth

+0

tenga cuidado de los casos con un subíndice, incluso cuando acaba de leer de ellos, es probable que tenga lugar la auto-detección –

15

Auto-vivification es la palabra. Desde el enlace:

Autovivification is a distinguishing feature of the Perl programming language involving the dynamic creation of data structures. Autovivification is the automatic creation of a variable reference when an undefined value is dereferenced. In other words, Perl autovivification allows a programmer to refer to a structured variable, and arbitrary sub-elements of that structured variable, without expressly declaring the existence of the variable and its complete structure beforehand.

In contrast, other programming languages either: 1) require a programmer to expressly declare an entire variable structure before using or referring to any part of it; or 2) require a programmer to declare a part of a variable structure before referring to any part of it; or 3) create an assignment to a part of a variable before referring, assigning to or composing an expression that refers to any part of it.

Perl autovivication can be contrasted against languages such as Python, PHP, Ruby, JavaScript and all the C style languages.

Auto-vivificación se puede desactivar con no autovivification;

+0

Seguí refrescando esta página para ver la respuesta porque tenía curiosidad. Wow, Perl realmente ES extraño :) – Bartek

+2

Me parece natural. –

+0

Esta es la virtud de Perl de DWIM (Haz lo que quiero decir). – spoulson

Cuestiones relacionadas