2009-12-04 11 views
5

Sé que el título suena gracioso, pero me encontré con este fragmento en alguna parte:¿Qué sucede en esta mi declaración?

my MyPackage $p1 = MyPackage->new; 

¿Qué papel tiene el nombre del paquete de servir en el frente de $p1?

EDITAR: Estoy ejecutando Perl 5.10.1.

Respuesta

6

De http://perldoc.perl.org/functions/my.html:

mi TIPO: EXPR ATTRS

A mi declara las variables enumeradas a ser locales (léxico) para el bloque que lo contiene, un archivo o eval. Si se enumera más de un valor, la lista debe colocarse entre paréntesis.

La semántica exacta y la interfaz de TYPE y ATTRS todavía están evolucionando. TYPE está actualmente vinculado al uso de los campos pragma, y ​​los atributos se manejan usando los atributos pragma, o comenzando desde Perl 5.8.0 también a través del módulo Attribute :: Handlers.

+0

Estoy haciendo esto en Perl5. ¿Es algo nuevo? – Geo

+0

Este aspecto de Perl6 se ha puesto a disposición en 5.10. No funcionará en 5.8 y antes. –

+2

La sintaxis ha estado disponible desde 5.8.0, simplemente no hace nada muy útil en 5.8. Tampoco hace nada muy útil en 5.10;) – hobbs

11

Se comprueba si hay un paquete con el mismo nombre, y, a partir de ahora, está ligado a la pragma fields que ayuda cheque por errores tipográficos en los nombres de campo.

Por ejemplo:

package MyPackage; 
use fields qw/ foo bar /; 
sub new { fields::new(shift) } 

Entonces, si intenta ejecutar

use MyPackage; 
my MyPackage $p1 = MyPackage->new; 
print $p1->{notpresent}, "\n"; 

se obtiene

No such class field "notpresent" in variable $p1 of type MyPackage at ... 
+0

Esta es la respuesta correcta. Nada que ver con Perl 6. Los "hash restringidos" reemplazaron los pseudo-hashes, pero rara vez se ven en estos días. – Schwern

0

Además del uso de campos, el tipo de léxico es utilizado por el experimental types pragma (disponible de CPAN).

Cuestiones relacionadas