2011-02-06 11 views
25

Continuo a vedere -> nel codice e non sono esattamente sicuro di cosa significhi. Ad esempio:Cosa fa la freccia -> in Perl?

@top_links = @{$m->links}; 

Cosa fa questa linea? Inoltre, dove posso leggere a riguardo?

risposta

28

Vedi The Arrow Operator in perlop:

"->" è un operatore infisso dereferenziare, così come è in C e C++. Se il lato destro è uno [...], {...} o un indice (...), il lato sinistro deve essere un riferimento rigido o simbolico a un array, un hash o una subroutine rispettivamente. (O tecnicamente parlando, una posizione in grado di contenere un riferimento difficile, se si tratta di un array o di un riferimento hash utilizzato per l'assegnazione.) Vedere perlreftut e perlref.

Altrimenti, il lato destro è un nome di metodo o una semplice variabile scalare che contiene il nome del metodo o un riferimento di subroutine e il lato sinistro deve essere un oggetto (un riferimento benedetto) o un nome di classe (cioè, un nome di pacchetto). Vedi perlobj.

+5

La penultima riga è un po 'fuorviante. Se lo scalare sul lato destro della freccia è un codice ref, non importa affatto quale sia il lato sinistro.Con 'my $ say_array = sub {print" @ {$ _ [0]} \ n "};' puoi quindi scrivere linee come '[1, 2, 3] -> $ say_array;' che stampa '1 2 3 ' –

+6

Potremmo menzionare che è simile all'operatore punto in molti altri linguaggi come Python, Java, Javascript, ecc. –

+2

@Eric Strom: mi sembra un bug – ysth

3

La @{} parte esterna è un dereference - questo implica $m->links è un riferimento ad un array, quindi questo operatore deferences per riferirsi alla matrice direttamente, che viene poi copiato @top_links

Capitolo 8 del 'Camel Book' è un buon posto per conoscere i riferimenti, o la sezione perlref della documentazione Perl.

L'operatore di freccia -> è un oggetto di riferimento, in questo caso il recupero dell'oggetto dell'oggetto $m. Allo stesso modo, i capitoli successivi del Camel Book trattano dettagliatamente il supporto orientato agli oggetti di Perl. Vedere anche la sezione perlobj della documentazione Perl.

12

In generale, -> suggerimenti su dereferenziazione. Questa sintassi proviene da C.

Nel proprio esempio, indica chiamata metodo: metodo chiamata links dall'istanza dell'oggetto in $m. Questo è spiegato nel capitolo Oggetti in Modern Perl. Pezzi di perlsub, perlfaq7, perlobj, perltoot fornire i dettagli.

Per i riferimenti in generale, search Stack Overflow; è un argomento ricorrente.

0

Perl operatore della freccia ha un altro uso:

Aula> metodo richiama il metodo subroutine in Class pacchetto

anche se è completamente diverso da quello del codice di esempio. Includere solo per completezza la domanda nel titolo.