GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Perl-Array-Referenz- und Dereferenzierungs-Tutorial mit praktischen Beispielen

In diesem Artikel sehen wir uns anhand von Beispielen an, wie Perl-Arrays referenziert und dereferenziert werden. Referenz ist nichts anderes als der Ort ( Adresse ) einer anderen Variablen. Die Referenzen können ein Array, ein Hash oder ein Schnipsel von Perl-Code sein. Referenzen machen den Perl-Code schneller.

Perl-Referenz auf Array

Normalerweise speichern wir die Liste der Elemente in einem Array wie unten gezeigt.

@array =  (“one”,”two”,”three”,”four”,”five”);

Um einer Variablen eine Array-Referenz zuzuweisen, verwenden Sie den Backslash(\)-Operator wie unten gezeigt

$array_ref = \@array;

Wenn Sie versuchen, die Variable $array_ref zu drucken, erhalten Sie etwa Folgendes:

ARRAY(0x1a2b3c)

Die Perl-Array-Referenz kann auch wie unten gezeigt an eine Unterroutine übergeben werden.

sub add_numbers
{
  my $array_ref =  shift;
  .....
}  

@numbers = (11,2,3,45);

$array_ref = add_numbers(\@numbers);

Im obigen Codeausschnitt müssen wir das Array dereferenzieren, damit die Subroutine die Elemente aus dem ursprünglichen Array übernehmen kann.

Im Folgenden sind einige der Vorteile der Übergabe der Referenz an eine Unterroutine aufgeführt, anstatt das gesamte Array zu übergeben.

  • Wenn wir das Array an eine Unterroutine übergeben, kopiert Perl das gesamte Array in die Variable @_. Wenn das Array groß ist, ist dies keine effektive Methode.
  • Wenn wir wollen, dass das ursprüngliche Array von der Subroutine modifiziert wird, müssen wir die Referenz des Arrays übergeben.
  • Referenzen spielen eine wesentliche Rolle beim Aufbau komplexer Datenstrukturen.

Wir können die Referenz eines anonymen Arrays wie unten gezeigt in die skalare Variable übernehmen.

$array_ref = [ 11,2,3,45];

Hinweis:Dieser Artikel ist Teil der fortlaufenden Perl-Tutorial-Reihe.

Perl-Dereferenzierungs-Array

Innerhalb der Subroutine kann die Dereferenzierung mit einer der unten gezeigten Methoden erfolgen.

Die Referenzvariable kann wie unten gezeigt dereferenziert werden. Mit dieser Methode können wir alle Elemente des Arrays nehmen. Dies ist dasselbe wie @Zahlen.

@{ $array_ref };

Gehen Sie wie folgt vor, um ein bestimmtes Element in einem Array zu erhalten. Diese Anweisung gibt das erste Element des @numbers-Arrays an. Dies ist dasselbe wie $numbers[0]

$ { $array_ref }[0]

Anstatt die Referenz in der Variablen zu speichern, kann auf die Array-Elemente direkt von der eingebauten Perl-Variable aus zugegriffen werden.

# Get all the elements of @numbers array.
@ { $_[0] }

# Get a particular element. This gives the first element of the array.
$ { $_[0] } [0]

Hinweis: Wenn wir eine einfache skalare Variable dereferenzieren, können wir die geschweiften Klammern wie unten gezeigt weglassen.

@$array_ref  # same as @{ $array_ref }

$$array_ref  # same as $ { $array_ref }

$_[0]         # not a simple scalar variable and this cant be dereferenced,

Speichern mehrerer Referenzen im Perl-Array

Lassen Sie uns das folgende Perl-Code-Snippet als Beispiel verwenden.

#Array contains source ip and destination ip
@IP = ('192.168.1.10','192.168.1.15'); 

#Array contains the source port and destination port numbers
@PORT = ("5000","5002"); 

#Sublayers of TCP layer
@TCP = ("Q931","H225","H245"); 

#Common layers are available in a TCP packet.
@LAYER = ("ETHERNET","IP",\@TCP); 

@PKT = (
         \@IP,
         \@PORT,
         \@LAYER
        );
#Storing the reference of @PKT array into the scalar variable.
$array_ref = \@PKT;

Um die Array-Referenzierung zu verstehen, nehmen wir an, dass wir aus dem obigen Code-Snippet auf die zweite Unterschicht („H225“) der TCP-Schicht zugreifen möchten. Dies kann wie unten beschrieben erfolgen.

Zuerst müssen wir auf das LAYER-Array zugreifen. Dies gibt eine Referenz des @LAYER-Arrays zurück.

$ { $array_ref } [2]

Die $array_ref ist eine einfache skalare Variable. Die geschweiften Klammern können also weggelassen werden und es kann auch wie unten gezeigt geschrieben werden.

$$array_ref[2]

Als nächstes greifen Sie über diese Referenz auf das dritte Element/die dritte Ebene (von @LAYER) zu.

$ { $ { $array_ref } [2] } [2]

Dies gibt die Adresse des @TCP-Arrays zurück.

Schließlich können wir die zweite Unterschicht der TCP-Schicht (vom @TCP-Array) erhalten, wie unten gezeigt.

$ { $ { $ { $array_ref } [2] } [2] } [1]

Das obige sieht ziemlich kompliziert aus und reduziert die Modularität des Codes. Es gibt eine Bestimmung, um die obigen Aussagen umzuschreiben und es auf folgende Weise für die Augen einfacher zu machen.

In Perl kann $ { VAR } [ $y] als VAR->[$y].

geschrieben werden
$ { $array_ref } [2]  is same as $array_ref->[2]

$ { $ { $array_ref } [2] } [2] is same as $array_ref->[2]->[2]

$ { $ { $ { $array_ref } [2] } [2] } [1] is same as $array_ref->[2]->[2]->[1]

Jetzt können wir es mit der „Drop Arrow“-Regel wie unten gezeigt umschreiben. Gemäß der Regel „Pfeil fallen lassen“ können wir den ersten Pfeil nicht entfernen. Das ist viel einfacher zu lesen.

$array_ref->[2][2][1]

Linux
  1. Linux nice and renice Command Tutorial (7 Beispiele)

  2. Bash-Arrays mit Beispielen

  3. Awk-Tutorial:Awk-Variablen verstehen mit 3 praktischen Beispielen

  4. AWK-Arrays erklärt mit 5 praktischen Beispielen

  5. Bash Shell Exit Status Tutorial mit praktischen Beispielen

10 praktische Beispiele für Regex mit grep

Unix Sed Tutorial:Mehrzeilige Dateioperation mit 6 praktischen Beispielen

Bash Scripting Einführungstutorial mit 5 praktischen Beispielen

Bash-Variablen-Tutorial – 6 praktische Bash-Beispiele für globale und lokale Variablen

Das ultimative Tar Command Tutorial mit 10 praktischen Beispielen

Tutorial zu Bash-Shell-Funktionen mit 6 praktischen Beispielen