Qual è il significato di @_
in Perl?Qual è il significato di @_ in Perl?
risposta
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 .
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.
In realtà il primo hit della ricerca su Google ora collega a questa stessa pagina. –
... 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
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. –
Tutte le "variabili speciali" di Perl sono elencate nella pagina di documentazione di perlvar.
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.
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 –
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
È 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.
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
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.
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 @_
.
@
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.
Si dovrebbe sempre usare strict. Ho modificato quindi la tua funzione secondaria. – EverythingRightPlace
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.
- 1. Qual è il significato di qr // in perl
- 2. Qual è il significato dell'operatore || =
- 3. Qual è il significato di ∃?
- 4. Qual è il significato di "==" in C?
- 5. Qual è il significato di "_" in python?
- 6. Qual è il significato di [...] in python?
- 7. Qual è il significato dell'operatore &?
- 8. Qual è il significato di -532459699?
- 9. Qual è il significato di CTOR?
- 10. Qual è il significato di svg: svg?
- 11. Qual è il significato SQL di 0x5E5B7D7E?
- 12. Qual è il significato di main_syntax
- 13. Qual è il significato di "Unità eroe"?
- 14. Qual è il significato di questo typedef?
- 15. Qual è il significato di questa sintassi?
- 16. Qual è il significato di id?
- 17. Qual è il significato di [...] regex?
- 18. qual è il significato di "this.this $ 0"?
- 19. Qual è il significato di System.CLSCompliantAttribute?
- 20. Qual è il significato di <#= #>
- 21. Qual è il significato di 'sourceSets.all *'
- 22. Qual è il significato di! #: 3?
- 23. Qual è il significato di -T o -w in #!/Usr/bin/perl?
- 24. Qual è il significato di -2 in questa istruzione IL?
- 25. Qual è il significato di * in * ngPer in angular2?
- 26. Qual è il significato di (int &) di conversione in C++
- 27. Qual è il significato di "()" in una chiamata di funzione?
- 28. Qual è il significato di $ in un nome di variabile?
- 29. Qual è il significato di `_t` di` size_t` in C?
- 30. Qual è il significato di [^] in espressioni regolari di Javascript?
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