2012-05-18 9 views
10

En el siguiente código:¿No debería acceder a @Whatever :: whatever producir al menos una advertencia en lugar de una matriz vacía?

use strict; 
use warnings; 
use Data::Dumper; 

my %hash = %Whatever::whatever; 
my @array = @Whatever::whatever; 
print Dumper \@array; 
print Dumper \%hash; 

Mi entendimiento es que @Whatever :: lo está accediendo a la tabla de símbolos, y no produce un mensaje de error porque la tabla de símbolos es un hash. Pero ¿por qué no hay al menos un mensaje de advertencia para acceder a un elemento no existente?

+0

Interesante: 'my @array = @Whatever;' genera un error, por supuesto. –

+2

Yo diría en cambio que '@Whatever :: whatever' identifica una matriz de ámbito dinámico llamada' @ whatever' en el paquete 'Whatever', en lugar de eso * * accediendo a la tabla de símbolos ... [algo así como] un hash . "* Los identificadores calificados como ese siempre han evitado' strict'ures. – pilcrow

+0

@pilcrow gracias. ¿Podrías poner esto como respuesta? –

Respuesta

1

(adaptación/migrar de un comentario)

yo diría que en lugar de que @Whatever::whatever identifica una matriz de ámbito dinámico llamado @whatever en el paquete Whatever, en lugar de esto es que "el acceso a la tabla de símbolos ... [ algo así como] un hash ".

Los identificadores calificados como ese siempre han evitado las restricciones (vea los documentos para strict 'vars').

12

Porque es casi imposible capturar una variable global en un estado de inexistencia en Perl. Tan pronto como menciona uno por su nombre, incluso para tomar una referencia al mismo, existe. Y porque las matrices y los hash son diferentes de los escalares; surge un escalar con el valor undef, que activa una advertencia de "uso del valor no inicializado" cuando se utiliza para la mayoría de los fines; pero las matrices y hashes vienen a la existencia como matrices vacías y hash, y una matriz vacía o hash no es lo suficientemente excepcional como para advertir!

+2

Es solo imposible si interpreta el problema demasiado estrictamente porque estricto hace un buen trabajo resolviendo ese problema. El problema es que una excepción fue específicamente extraída de estrictos para nombres totalmente calificados. Uno solo necesita ser un poco más cuidadoso al usarlos. – ikegami

Cuestiones relacionadas