2010-12-30 25 views

risposta

97

perldoc perlvar è il primo posto per verificare eventuali informazioni sulla variabile Perl con nome speciale.

quotazioni:

@_: All'interno di una subroutine matrice @_ contiene i parametri passati alla subroutine.

Maggiori dettagli possono essere trovati in perldoc perlsub (Perl subroutines) collegato dal perlvar:

Qualsiasi argomento passato mostra nella matrice @_.

Pertanto, se si chiama una funzione con due argomenti, quelli verranno memorizzati in $_[0] e $_[1].

La matrice @_ è una matrice locale , ma i suoi elementi sono alias per i parametri effettivi scalari. In particolare, se un elemento $ _ [0] viene aggiornato, l'argomento corrispondente viene aggiornato (o si verifica un errore se non è aggiornabile ).

Se un argomento è un elemento di matrice o hash che non esisteva quando la funzione è stata chiamata, che elemento viene creato solo quando (e se) viene modificato o un riferimento ad essa è scattata. (Alcune versioni precedenti di Perl hanno creato l'elemento indipendentemente dall'elemento assegnato a). Assegnando a l'intero array @_ rimuove l'aliasing e non aggiorna alcun argomento .

+0

Grazie, mi sono solo abituato di recente a controllare perldoc, e ho trovato utili le pagine web: http://perldoc.perl.org/perlvar.html Non è stato male creare uno stub perl che lo lanci su il web ... la formattazione di una pagina web mi aiuta molto. – aschultz

8

primo colpo di un search for perl @_ dice this:

@_ l 'elenco dei parametri in entrata a un sub.

Ha anche una spiegazione più lunga e più dettagliata della stessa.

+0

In realtà il primo hit della ricerca su Google ora collega a questa stessa pagina. –

+0

... sette * anni * più tardi, un'eternità nel tempo di internet. Questo è il motivo per cui ho entrambi collegato al primo risultato e ho sottovalutato la parte rilevante: dipendere solo da Google sarebbe stato molto ingenuo. – Piskvor

+0

true è molti anni dopo, ma è ancora fastidioso leggere la risposta che implica che si dovrebbe Google per una risposta alla domanda. È un'inutile informazione per qualcuno che legge la risposta come risultato di Google. –

5

Tutte le "variabili speciali" di Perl sono elencate nella pagina di documentazione di perlvar.

20

Di solito, si espande i parametri passati ad una sub utilizzando la variabile @_:

sub test{ 
    my ($a, $b, $c) = @_; 
    ... 
} 

# call the test sub with the parameters 
test('alice', 'bob', 'charlie'); 

Questo è il modo affermato di essere corretto perlcritic.

+0

questa è una volta che non sono d'accordo con 'perlcritic', personalmente penso che questo sia il migliore per una funzione, ma per un metodo, è utile 'spostare' l'auto-riferimento, quindi decomprimere l'array' @ _'. Questo rende chiaro che questo è un metodo E che il metodo prende determinati parametri –

+0

Probabilmente avrei dovuto usare/conosciuto su PERCRITIC prima, ma non l'ho fatto. Grazie per averlo utilizzato in questo esempio. A volte roba che fai riferimento a qualcuno può aiutare qualcuno a imparare qualcosa di completamente nuovo per loro. – aschultz

5

È inoltre possibile utilizzare shift per singole variabili nella maggior parte dei casi:

$var1 = shift; 

Questo è un argomento in cui si dovrebbe ricerca ulteriormente come Perl ha un certo numero di modi interessanti di accesso alle informazioni al di fuori all'interno del vostro sub routine.

+3

Cool, chiunque mi abbia dato un voto negativo semplicemente per aver pubblicato un altro modo per fare una cosa simile. Mi rendo conto che non ho risposto direttamente alla domanda perché qualcuno lo ha già fatto, ma ho offerto una forma alternativa che i nuovi programmatori perl sono spesso confusi da. – hockfan86

7

La domanda era cosa @_significa in Perl. La risposta a questa domanda è che, nella misura in Perl, @_ significa .

Nessuno sembra aver menzionato questo aspetto critico della sua significato - così come loro.

Sono quindi entrambi utilizzati come pronomi o talvolta come topicalizzatori.

In genere hanno antecedenti nominali, anche se non sempre.

1

Anche se una funzione restituisce un array, ma la funzione viene chiamata senza assegnare i dati restituiti a qualsiasi variabile come di seguito. Qui viene chiamato split(), ma non è assegnato a nessuna variabile. Siamo in grado di accedere ai suoi dati restituiti in seguito attraverso @_:

$str = "Mr.Bond|Chewbaaka|Spider-Man"; 
split(/\|/, $str); 

print @_[0]; # 'Mr.Bond' 

Ciò dividere la stringa $str e impostare l'array @_.

1

@ viene utilizzato per un array.

In una subroutine o quando si chiama una funzione in Perl, è possibile passare all'elenco dei parametri. In tal caso, @_ è può essere usato per passare l'elenco dei parametri alla funzione:

sub Average{ 

    # Get total number of arguments passed. 
    $n = scalar(@_); 
    $sum = 0; 

    foreach $item (@_){ 

     # foreach is like for loop... It will access every 
     # array element by an iterator 
     $sum += $item; 
    } 

    $average = $sum/$n; 

    print "Average for the given numbers: $average\n"; 
} 

chiamata Funzione

Average(10, 20, 30); 

Se si osserva il codice di cui sopra, vedere la linea foreach $item(@_) ... Eccolo passa il parametro di input.

+0

Si dovrebbe sempre usare strict. Ho modificato quindi la tua funzione secondaria. – EverythingRightPlace

0

Non provare mai a modificare su @_ variabile !!!! Non devono essere toccati .. O si ottiene un effetto insospettato. Per esempio ...

my $size=1234; 
sub sub1{ 
    $_[0]=500; 
} 
sub1 $size; 

Prima chiamata sub1 $ dimensione contiene 1234. Ma dopo 500 (!!) in modo da non modificare questo valore !!! Puoi passare due o più valori e cambiarli in subroutine e tutti saranno cambiati! Non ho mai visto questo effetto descritto. I programmi che ho visto lasciano anche @_ array readonly. E solo che si può passare in sicurezza variabile non cambiato sottoprogramma interno Si deve sempre farlo:

sub sub2{ 
    my @[email protected]_; 
    .... 
} 

assegnare @_ a variabili di procedura subroutine locali e accanto lavorato con loro. Anche in alcuni algoritmi ricorsivi profondi che rientrano in array è possibile utilizzare questo approccio per ridurre la memoria utilizzata per le vars locali. Solo se return @_ array lo stesso.