Was bedeutet @_ in Perl?

89

Was bedeutet @_Perl?

Andrei
quelle

Antworten:

118

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.

DVK
quelle
Vielen Dank, ich habe mich erst kürzlich daran gewöhnt, Perldoc zu überprüfen, und ich fand die Webseiten nützlich: perldoc.perl.org/perlvar.html Es war nicht schlecht, einen Perl-Stub zu erstellen , der dies im Web startet ... Die Formatierung einer Webseite hilft mir sehr.
Aschultz
27

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 .

eckes
quelle
2
Dies ist ein Mal, mit dem ich nicht einverstanden bin. Ich perlcriticpersönlich denke, dass dies für eine Funktion am besten ist, aber für eine Methode ist es nützlich, sich shiftselbst zu referenzieren und dann das @_Array zu entpacken . Dies macht deutlich, dass dies eine Methode ist UND dass die Methode bestimmte Parameter akzeptiert
Joel Berger
Ich hätte PERLCritic wahrscheinlich schon früher verwenden sollen, aber ich habe es nicht getan. Vielen Dank, dass Sie es in diesem Beispiel verwendet haben. Manchmal können Dinge, auf die Sie spontan verweisen, jemandem helfen, etwas völlig Neues für ihn zu lernen.
Aschultz
10

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.

Piskvor verließ das Gebäude
quelle
3
Der erste Treffer Ihrer Google-Suche verweist jetzt auf genau diese Seite.
Gabriel Southern
... sieben Jahre später, eine Ewigkeit in der Internetzeit. Deshalb habe ich sowohl auf das erste Ergebnis verlinkt als auch den relevanten Teil besprochen: Abhängig von Google allein wäre das sehr naiv.
Piskvor verließ das Gebäude
1
Es ist zwar viele Jahre später, aber es ist immer noch ärgerlich, eine Antwort zu lesen, die impliziert, dass Sie Google für eine Antwort auf die Frage verwenden sollten. Es ist sinnlose Information für jemanden, der die Antwort als Ergebnis von Googeln liest.
Gabriel Southern
Ich bin nicht einverstanden. "Suchen Sie nach Ihrem Problem, bevor Sie eine Frage stellen" ist immer noch Schritt 0. stackoverflow.com/help/how-to-ask Ärgerlich für Sie vielleicht - aber auch eine Reihe von wiederholten Fragen, die durch Abfragen der Maschinen zuerst beantwortet werden könnten .
Piskvor verließ das Gebäude
1
Ja, die Suche ist der richtige erste Schritt, aber es ist nicht erforderlich, Anweisungen zur Suche in Ihre Antwort aufzunehmen. Es sind redundante Informationen, die keinen Wert hinzufügen, und es ist ironisch, denn wenn jemand dem Suchlink in Ihrer Antwort folgt, bringt er ihn dorthin zurück, wo er begonnen hat.
Gabriel Southern
10

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.

tchrist
quelle
7

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.

hockfan86
quelle
3
Cool, wer auch immer mich abgelehnt hat, nur weil ich einen anderen Weg gepostet habe, um etwas Ähnliches zu tun. Mir ist klar, dass ich die Frage nicht direkt beantwortet habe, weil es bereits jemand getan hat, aber ich habe eine alternative Form angeboten, die neue Perl-Programmierer oft verwirrt.
hockfan86
5

Alle "speziellen Variablen" von Perl sind auf der Perlvar- Dokumentationsseite aufgeführt.

aschepler
quelle
2

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 $strund das Array festgelegt @_.

Afser2000
quelle
1

@ 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";
}

Funktionsaufruf

Average(10, 20, 30);

Wenn Sie den obigen Code beachten, lesen Sie die foreach $item(@_)Zeile ... Hier wird der Eingabeparameter übergeben.

Omar Faroque Anik
quelle
Das solltest du immer use strict. Ich habe daher Ihre Unterfunktion bearbeitet.
EverythingRightPlace
0

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.

Anatoly
quelle