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

IMO è sufficiente avere a::func, a->func.Perché `a :: -> func;` valido?

a::->func; mi sembra molto strano, perché Perl supporta questo tipo di sintassi dall'aspetto strano?

+5

Se si pensa che la sintassi * * è strano ... –

+9

Perl ha bisogno né ragioni né scuse. Perl è Perl. –

+0

@pst - Vi sfido a presentarne uno sconosciuto :) – DVK

risposta

25

Per citare l'eccellente post sul blog di Chromatic sull'argomento allo Modern Perl blog: "Per evitare l'ambiguità di parsing delle bareword."

Per illustrare il motivo per cui tale sintassi è utile, ecco un esempio evoluto da campione:

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:: è una stringa letterale che produce la stringa a. Tutti gli stessi:

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

ecc

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

+1. Un altro +1 se mi dici come cancellare gli ultimi due. – DVK

+0

@DVK, 'chr' è una funzione molto utile. Questo ovviamente non è il posto in cui utilizzarlo, comunque. 'v97' è una stringa di versione e non è nemmeno particolarmente utile come stringa di versione. – ikegami

Problemi correlati