it-swarm-eu.dev

Was bedeutet @_ in Perl?

Was bedeutet @_ in Perl?

78
Andrei

perldoc perlvar ist der erste Ort, an dem nach Perl-Variableninformationen mit speziellen Namen gesucht wird. 

Zitieren:

@_: Innerhalb einer Subroutine enthält das Array @_ die an diese Subroutine übergebenen Parameter.

Weitere Details finden Sie in perldoc perlsub (Perl-Subroutinen) linked aus der Perlvar:

Alle übergebenen Argumente werden in der .__ angezeigt. Array @_

Wenn Sie also eine Funktion mit zwei Argumenten aufgerufen haben, werden diese würde in $_[0] und $_[1] gespeichert werden.

Das Array @_ ist ein lokales Array, jedoch sein Elemente sind Aliase für die tatsächlichen Skalarparameter. Insbesondere wenn ein Element $ _ [0] wird aktualisiert, das Das entsprechende Argument wird aktualisiert (oder es tritt ein Fehler auf, wenn es nicht aktualisierbar ist.). 

Wenn ein Argument ein Array ist oder Hash-Element, das nicht vorhanden war als die Funktion aufgerufen wurde, war das Element wird nur erstellt, wenn (und wenn) es wird geändert oder ein Verweis darauf ist genommen (In früheren Versionen von Perl Wurde das Element erstellt, unabhängig davon, ob das Element Zugewiesen wurde.) Zuweisen von das ganze Array @_ entfernt das Aliasing und aktualisiert keine Argumente.

109
DVK

Normalerweise erweitern Sie die an eine sub übergebenen Parameter mit der @_-Variablen:

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

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

Das ist der Weg, von dem behauptet wird, er sei korrekt von perlcritic .

22
eckes

Die Frage war, was @_bedeutet in Perl bedeutet. Die Antwort auf diese Frage ist, dass, sofern $_ in Perl it bedeutet, @_ in ähnlicher Weise they bedeutet.

Niemand scheint diesen kritischen Aspekt der seiner Bedeutung - sowie ihrer - erwähnt zu haben.

Sie werden folglich sowohl als Pronomen als auch manchmal als Topizierer verwendet. 

Sie haben normalerweise nominale Vorgeschichte, wenn auch nicht immer.

9
tchrist

Erster Treffer einer Suche nach Perl @_ sagt diese :

@_ ist die Liste der ankommenden Parameter für ein Sub.

Es hat auch eine längere und ausführlichere Erklärung für dasselbe.

8
Piskvor

Alle "speziellen Variablen" von Perl sind auf der Dokumentationsseite perlvar aufgelistet.

5
aschepler

In den meisten Fällen können Sie auch shift für einzelne Variablen verwenden:

$var1 = shift;

Dies ist ein Thema, in dem Sie weiter recherchieren sollten, da Perl eine Reihe interessanter Möglichkeiten für den Zugriff auf externe Informationen in Ihrer Subroutine bietet.

5
hockfan86

Auch wenn eine Funktion ein Array zurückgibt, die Funktion jedoch aufgerufen wird, ohne dass die zurückgegebenen Daten einer Variablen wie unten zugewiesen werden Hier wird split () aufgerufen, aber keiner Variablen zugewiesen. Wir können auf die zurückgegebenen Daten später über @_ zugreifen:

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

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

Dadurch wird die Zeichenfolge $str aufgeteilt und das Array @_ festgelegt.

2
Afser2000

@ wird für ein Array verwendet.

In einer Subroutine oder beim Aufrufen einer Funktion in Perl können Sie die Parameterliste übergeben. In diesem Fall kann mit @_ is die Parameterliste an die Funktion übergeben werden:

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, sehen Sie die Zeile foreach $item(@_) ... Hier wird der Eingabeparameter übergeben.

1

Versuchen Sie niemals, die Variable @_ zu bearbeiten !!!! Sie müssen nicht berührt werden. Oder Sie erhalten einen unerwarteten Effekt. Zum Beispiel...

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

Vor dem Aufruf ist die Größe von $ $ 1234. Aber nach 500 (!!) bearbeitest du diesen Wert nicht !!! Sie können zwei oder mehr Werte übergeben und in der Subroutine ändern, und alle werden geändert! Ich habe diesen Effekt noch nie beschrieben. Programme, die ich gesehen habe, lassen auch das @_-Array gelesen. Und nur, dass Sie die Variable sicher übergeben können, hat die interne Subroutine nicht geändert. Sie müssen das immer tun:

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

weisen Sie @_ den lokalen Subroutinen-Prozedurvariablen zu und arbeiten Sie anschließend mit ihnen. Auch in einigen rekursiven Algorithmen, die ein Array zurückgeben, können Sie diesen Ansatz verwenden, um den für lokale Variablen verwendeten Speicher zu reduzieren. Nur wenn return @_array gleich ist. 

0
Anatoly