Antworten:
perldoc perlvar ist der erste Ort, an dem nach Informationen zu speziellen Perl-Variablen gesucht wird.
Zitat:
@_
: Innerhalb einer Unterroutine@_
enthält das Array die an diese Unterroutine übergebenen Parameter.
Weitere Details finden Sie in perldoc perlsub (Perl-Subroutinen), die von der perlvar verlinkt sind:
Alle übergebenen Argumente werden im Array angezeigt
@_
.Wenn Sie also eine Funktion mit zwei Argumenten aufrufen, werden diese in
$_[0]
und gespeichert$_[1]
.Das Array
@_
ist ein lokales Array , aber seine Elemente sind Aliase für die tatsächlichen Skalarparameter . Insbesondere wenn ein Element $ _ [0] aktualisiert wird, wird das entsprechende Argument aktualisiert (oder ein Fehler tritt auf, wenn es nicht aktualisierbar ist).Wenn ein Argument ein Array- oder Hash-Element ist, das beim Aufruf der Funktion nicht vorhanden war, wird dieses Element nur erstellt, wenn (und wenn) es geändert oder ein Verweis darauf verwendet wird. (Einige frühere Versionen von Perl haben das Element erstellt, unabhängig davon, ob das Element zugewiesen wurde oder nicht.) Durch Zuweisen zum gesamten Array @_ wird dieses Aliasing entfernt und es werden keine Argumente aktualisiert.
Normalerweise erweitern Sie die an ein Sub übergebenen Parameter mithilfe der @_
Variablen:
sub test{
my ($a, $b, $c) = @_;
...
}
# call the test sub with the parameters
test('alice', 'bob', 'charlie');
Das ist der Weg, der von perlcritic für richtig gehalten wird .
perlcritic
persönlich denke, dass dies für eine Funktion am besten ist, aber für eine Methode ist es nützlich, sich shift
selbst zu referenzieren und dann das @_
Array zu entpacken . Dies macht deutlich, dass dies eine Methode ist UND dass die Methode bestimmte Parameter akzeptiert
Der erste Treffer einer Suche nachperl @_
sagt Folgendes :
@_ ist die Liste der eingehenden Parameter für ein Sub.
Es gibt auch eine längere und detailliertere Erklärung dafür.
Die Frage war, was in Perl @_
bedeutet . Die Antwort auf diese Frage lautet: Soweit es in Perl bedeutet , $_
bedeutet dies in @_
ähnlicher Weise, dass sie es sind .
Niemand scheint diesen kritischen Aspekt seiner Bedeutung erwähnt zu haben - und auch nicht ihren .
Sie werden folglich beide als Pronomen oder manchmal als Aktualisierer verwendet.
Sie haben normalerweise nominelle Vorgeschichte, wenn auch nicht immer.
In den meisten Fällen können Sie die Verschiebung auch für einzelne Variablen verwenden:
$var1 = shift;
Dies ist ein Thema, in dem Sie weiter recherchieren sollten, da Perl eine Reihe interessanter Möglichkeiten bietet, auf externe Informationen innerhalb Ihrer Subroutine zuzugreifen.
Auch wenn eine Funktion ein Array zurückgibt, die Funktion jedoch aufgerufen wird, ohne die zurückgegebenen Daten einer Variablen wie unten zuzuweisen. Hier wird split () aufgerufen, aber keiner Variablen zugewiesen. Wir können später über @_ auf die zurückgegebenen Daten zugreifen:
$str = "Mr.Bond|Chewbaaka|Spider-Man";
split(/\|/, $str);
print @_[0]; # 'Mr.Bond'
Dadurch wird die Zeichenfolge aufgeteilt $str
und das Array festgelegt @_
.
@
wird für ein Array verwendet.
In einem Unterprogramm oder wenn Sie eine Funktion in Perl aufrufen, können Sie die Parameterliste übergeben. In diesem Fall kann @_
is verwendet werden, um die Parameterliste an die Funktion zu übergeben:
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";
}
Average(10, 20, 30);
Wenn Sie den obigen Code beachten, lesen Sie die foreach $item(@_)
Zeile ... Hier wird der Eingabeparameter übergeben.
use strict
. Ich habe daher Ihre Unterfunktion bearbeitet.
Versuchen Sie niemals, die Variable @_ zu bearbeiten !!!! Sie dürfen nicht berührt werden. Oder Sie erhalten einen unerwarteten Effekt. Beispielsweise...
my $size=1234;
sub sub1{
$_[0]=500;
}
sub1 $size;
Vor dem Aufruf enthält sub1 $ size 1234. Aber nach 500 (!!) Bearbeiten Sie diesen Wert also nicht !!! Sie können zwei oder mehr Werte übergeben und diese im Unterprogramm ändern, und alle werden geändert! Ich habe diesen Effekt noch nie beschrieben gesehen. Programme, die ich gesehen habe, lassen das Array @_ schreibgeschützt. Und nur, dass Sie die Variable sicher übergeben können, haben Sie das interne Unterprogramm nicht geändert. Das müssen Sie immer tun:
sub sub2{
my @m=@_;
....
}
Weisen Sie lokalen Subroutinenprozedurvariablen @_ zu und arbeiten Sie als Nächstes mit ihnen. Auch in einigen tief rekursiven Algorithmen, die das Array zurückführen, können Sie diesen Ansatz verwenden, um den für lokale Variablen verwendeten Speicher zu reduzieren. Nur wenn @_ Array gleich zurückgegeben wird.