2010-01-13 9 views
14

Come per il mio codice di esempio, ci sono due stili per chiamare una subroutine: subname e subname().Devo chiamare le subroutine Perl senza argomenti come marine() o marine?

#!C:\Perl\bin\perl.exe 
use strict; 
use warnings; 

use 5.010; 

&marine(); # style 1 
&marine; # style 2 

sub marine { 
    state $n = 0; # private, persistent variable $n 
    $n += 1; 
    print "Hello, sailor number $n!\n"; 
} 

Che uno, &marine(); o &marine;, è la scelta migliore se non ci sono argomenti nella chiamata?

+0

Oltre alle informazioni fornite da altri, la documentazione ([perlsub] (http://perldoc.perl.org/perlsub.html)) spiega le regole per l'uso delle parentesi. – toolic

risposta

23

In Learning Perl, da dove viene questo esempio, siamo all'inizio di mostrare le subroutine. Vi diciamo solo di usare lo & in modo che voi, all'inizio del Perler, non vi imbattete in un problema in cui definite una subroutine con lo stesso nome di un built-in Perl, quindi chiedetevi perché non funziona. Il & davanti chiama sempre la subroutine definita. Gli studenti principianti spesso creano la propria subroutine log per stampare un messaggio perché sono abituati a farlo in altre tecnologie che usano. In Perl, questa è la funzione matematica integrata.

Dopo essersi abituati a usare Perl e conoscere i componenti aggiuntivi Perl (scansione attraverso perlfunc), rilasciare &. C'è un po 'di magia speciale con & che è quasi mai necessario:

marine(); 

Puoi lasciare fuori la () se hai pre-ha dichiarato la subroutine, ma io di solito lasciare il () lì anche per una lista di argomenti vuota. È un po 'più robusto dato che stai dando a Perl il suggerimento che lo marine è un nome di subroutine. Per me, lo riconosco più rapidamente come subroutine.

+7

Stai anche dando a te stesso e agli altri manutentori del codice un suggerimento che si tratta di un nome di subroutine. – Quentin

+5

Forse potrebbe essere meglio abbandonare l'uso di '&' negli esempi, poiché è probabile che venga usato in modo inappropriato. – Ether

+0

Dopo aver insegnato Perl per un lungo periodo, sei "probabile" in teoria nel mio "quasi mai" in pratica. –

7

È consigliabile dichiarare le subroutine prima con la parola chiave sub, quindi chiamarle. (Naturalmente there are ways around it, ma perché fare le cose più complicate del necessario?)

Non usare la sintassi & se non si sa che cosa fa esattamente al @_ e subroutine dichiarate con i prototipi. È terribilmente oscuro, raramente necessario e una fonte di bug attraverso un comportamento non intenzionale. Basta lasciarlo fuori – Perl::Critic giustamente dice su di esso:

Dal Perl 5, il sigillo e commerciale è completamente opzionale quando si invoca subroutine.

Ora, data seguendo questi suggerimenti di stile, io preferisco chiamare subroutine che non richiedono parametri in stile 1, vale a dire marine();. Le ragioni sono

  1. coerenza visiva con sottoprogrammi che non richiedono parametri
  2. non può essere confuso con una parola chiave diversa.
+0

brian era 28 secondi più veloce. – daxim

+1

Puoi descrivere (o fornire un collegamento a) cosa '&' fa a '@ _'? –

+0

@daxim, grazie :-) –

1

perl consente di omettere la parentesi nella chiamata di funzione.
così si può chiamare la funzione con argomenti in due modi diversi:
your_function(arg1,arg2,arg3);
o
your function arg1,arg2,arg3 ;
sua una questione di scelta che quale forma preferisci. Con gli utenti di C il primo è più intuitivo.
Io personalmente uso il primo per le funzioni definite da me e quest'ultimo per costruito nelle funzioni come:

print "something" invece di print("something")

+0

Faccio la stessa cosa (anche se c'è una mia funzione in cui non uso Parens, cioè ho scritto una funzione chiamata "prt" che è fondamentalmente la stessa della stampa – tster

4

Come regola generale vi consiglio il seguente:

  1. A meno che non è necessario il & perché hai finito con una funzione incorporata o non hai nessun elenco di parametri ometto.

  2. Includere sempre il simbolo() come in marine().

Faccio entrambe le cose per la leggibilità del codice. La prima regola chiarisce quando sto sovrascrivendo le funzioni interne di Perl rendendole distinte. Il secondo chiarisce quando invoco le funzioni.

15

L'effetto collaterale dell'uso di & senza parentesi è che la subroutine viene richiamata con @_. Questo programma

sub g { 
    print "g: @_\n"; 
} 
sub f { 
    &g(); # g() 
    &g;  # g(@_) 
    g(); # g() 
    g;  # g() 
} 
f(1,2,3); 

produce questo risultato:

 
g: 
g: 1 2 3 
g: 
g: 
+3

Per quanto mi piaccia Perl sembra che non passa una settimana senza che io impari un nuovo horror nascosto lì da qualche parte in attesa di mordermi .. –

+4

@Dave, la cosa '& subname;' è malvagia se lo fai per sbaglio, ma è anche potenzialmente utile. 50 subroutine che hanno esigenze di sanitizzazione di argomenti simili È possibile creare un disinfettante che funzioni direttamente sull'elenco di argomenti della funzione di chiamata. "Sub foo {& clean_args; my $ foo = shift; ecc.}" Sì, si potrebbe semplicemente restituire un array separato e gestiscilo, nelle funzioni, ma poi devi manipolare la sintassi della gestione degli argomenti ovunque.Questi "orrori" usati con parsimonia e in modo appropriato rendono possibile fare cose difficili facilmente. – daotoad

Problemi correlati