2011-09-05 11 views
16
package a; 
sub func { 
print 1; 
} 
package main; 
a::->func; 

IMO es suficiente tener a::func, a->func.¿Por qué `a :: -> func;` válido?

a::->func; me parece muy extraño, ¿por qué Perl admite este tipo de sintaxis de aspecto extraño?

+5

Si cree que * * sintaxis es extraño ... –

+9

Perl no necesita ni razones ni excusas. Perl es Perl. –

+0

@pst - Te reto a presentarle a un extraño :) – DVK

Respuesta

25

Para citar la excelente publicación de blog de chromatic sobre el tema en Modern Perl blog: "Para evitar la ambigüedad de análisis de la palabra clásica".

para ilustrar por qué tales sintaxis es útil, he aquí un ejemplo evolucionado a partir de su muestra:

package a; 
our $fh; 
use IO::File; 
sub s { 
    return $fh = IO::File->new(); 
} 

package a::s; 
sub binmode { 
    print "BINMODE\n"; 
} 

package main; 
a::s->binmode; # does that mean a::s()->binmode ? 
       # calling sub "s()" from package a; 
       # and then executing sub "open" of the returned object? 
       # In other words, equivalent to $obj = a::s(); $obj->binmode(); 
       # Meaning, set the binmode on a newly created IO::File object? 

a::s->binmode; # OR, does that mean "a::s"->binmode() ? 
       # calling sub "binmode()" from package a::s; 
       # Meaning, print "BINMODE" 

a::s::->binmode; # Not ambiguous - we KNOW it's the latter option - print "BINMODE" 
9

a:: es una cadena literal que produce la cadena a. De todos modos:

a->func() # Only if a doesn't exist as a function. 
"a"->func() 
'a'->func() 
a::->func() 
v97->func() 
chr(97)->func() 

etc

>perl -E"say('a', a, a::, v97, chr(97))" 
aaaaa 
+1

+1. Otro +1 si me dices cómo no recordar los dos últimos. – DVK

+0

@DVK, 'chr' es una función muy útil. Sin embargo, obviamente este no es el lugar para usarlo. 'v97' es una cadena de versión, y ni siquiera es particularmente buena para usar como una cadena de versión. – ikegami

Cuestiones relacionadas