2010-03-30 20 views
8

Acabo de ver algo de código en nuestra base de código (y es viejo código, como en Perl 3 o Perl 4 días) que tiene este aspecto (estoy simplificando en gran medida):¿Qué está haciendo Perl con este argumento para impulsar en este caso?

@array; 
push(array, $some_scalar); 

en cuenta que la array en el push() no tiene un @. Supongo que el código detrás de push sabe que se supone que el primer argumento es una matriz, de modo que toma la matriz del tipo array typeglob. ¿Eso es más o menos? Si Perl puede hacerlo sin problemas, ¿por qué debería incluir el @?

+1

Ejecute este código con 'use warnings' y verifique si eso responde a su pregunta. – mob

+1

Activar las advertencias de este antiguo código sería un desastre total, pero entiendo su punto. – Morinar

+2

@Monirar: si tiene que mantener este código, mejorarlo para funcionar con advertencias habilitadas podría ser muy útil. –

Respuesta

9

Esta es una antigua 'característica' del analizador. @ No es obligatorio en un impulso si la variable es una variable de paquete. Esto es considerado por muchos como un error que debería ser reparado. Realmente no deberías estar haciendo esto.

+0

Hm, en realidad no parece realizar el empuje. Con esto: 'perl -e 'my @array =(); push (array, "foo"); print "@array \ n"; '' No obtengo ningún resultado. ¿Hago algo tonto? – Cascabel

+2

Quizás tenga algo que ver con typeglobs entonces. El código de ejemplo de Jefromi anterior no genera nada, pero si quita el 'mi', entonces lo hace. – mob

+1

Sí, tienes razón. Parece que solo funciona para las variables del paquete. –

4

Esta es una "característica" dudosa de perl, comportamiento obsoleto; debería ser un error, pero funciona.

Si enciende las advertencias del compilador (Perl -W, muy recomendable), advierte:

Array @aa missing the @ in argument 1 of push() at xx.pl line 2. 
Cuestiones relacionadas