GNU/Linux >> Znalost Linux >  >> Linux

Perl Array Reference a Dereference Tutorial s praktickými příklady

V tomto článku se podíváme na to, jak odkazovat a dereferencovat pole Perl s příklady. Reference není nic jiného než umístění ( adresa ) jiné proměnné. Odkazy mohou být pole, hash nebo fragment kódu Perl. Reference umožňují rychlejší běh kódu v Perlu.

Odkaz v Perlu na pole

Normálně ukládáme seznam prvků do pole, jak je uvedeno níže.

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

Chcete-li přiřadit odkaz na pole do proměnné, použijte operátor zpětného lomítka (\), jak je uvedeno níže

$array_ref = \@array;

Pokud se pokusíte vytisknout proměnnou $array_ref, dostanete něco jako následující.

ARRAY(0x1a2b3c)

Odkaz na pole Perl lze také předat podprogramu, jak je ukázáno níže.

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

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

$array_ref = add_numbers(\@numbers);

Ve výše uvedeném úryvku kódu musíme zrušit reference na pole, aby podprogram mohl převzít prvky z původního pole.

Následují některé z výhod předávání odkazu podprogramu namísto předávání celého pole.

  • Pokud jsme pole předali podprogramu, Perl zkopíruje celé pole do proměnné @_. Když je pole velké, není to efektivní metoda.
  • Když chceme, aby bylo původní pole upraveno podprogramem, musíme předat odkaz na pole.
  • Reference hrají zásadní roli při vytváření složitých datových struktur.

Můžeme vzít odkaz na anonymní pole do skalární proměnné, jak je uvedeno níže.

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

Poznámka:Tento článek je součástí probíhající série Perl Tutorial.

Pole dereference Perl

Uvnitř podprogramu lze dereference provést pomocí jedné z níže uvedených metod.

Referenční proměnnou lze dereferencovat, jak je uvedeno níže. Pomocí této metody můžeme vzít všechny prvky pole. To je stejné jako @čísla.

@{ $array_ref };

Chcete-li získat konkrétní prvek v poli, proveďte následující. Tento příkaz poskytuje první prvek pole @numbers. To je stejné jako $numbers[0]

$ { $array_ref }[0]

Místo uložení odkazu do proměnné lze prvky pole přistupovat přímo z vestavěné proměnné Perlu.

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

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

Poznámka: Pokud dereferencujeme jednoduchou skalární proměnnou, pak můžeme vynechat složené závorky, jak je uvedeno níže.

@$array_ref  # same as @{ $array_ref }

$$array_ref  # same as $ { $array_ref }

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

Ukládání více referencí do pole Perl

Použijme následující ukázkový fragment kódu Perl.

#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;

Abychom porozuměli odkazování na pole, předpokládejme, že z výše uvedeného fragmentu kódu chceme získat přístup k druhé podvrstvě („H225“) vrstvy TCP. To lze provést, jak je vysvětleno níže.

Nejprve musíme přistupovat k poli LAYER. To vrátí odkaz na pole @LAYER.

$ { $array_ref } [2]

$array_ref je jednoduchá skalární proměnná. Složené závorky lze tedy vynechat a lze je také zapsat tak, jak je uvedeno níže.

$$array_ref[2]

Dále pro přístup ke třetímu prvku/vrstvě (z @LAYER) prostřednictvím tohoto odkazu.

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

To vrátí adresu pole @TCP.

Nakonec můžeme získat druhou podvrstvu vrstvy TCP (z pole @TCP), jak je ukázáno níže.

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

Výše uvedené vypadá docela komplikovaně a snižuje modularitu kódu. Existuje ustanovení, které přepisuje výše uvedená prohlášení a usnadňuje to očím následujícím způsobem.

V Perlu lze $ { VAR } [ $y] zapsat jako VAR->[$y].

$ { $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]

Nyní jej pomocí pravidla „drop arrow“ můžeme přepsat, jak je uvedeno níže. Podle pravidla „drop arrow“ nemůžeme odstranit první šipku. To se čte mnohem snadněji.

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

Linux
  1. Kurz rozbalení a rozbalení příkazů s příklady

  2. Bash pole s příklady

  3. Echo Command s praktickými příklady

  1. Linux nice and renice Command Tutorial (7 příkladů)

  2. Výukový program Awk:Pochopte proměnné Awk pomocí 3 praktických příkladů

  3. Bash Shell Exit Status Tutorial s praktickými příklady

  1. Bash HereDoc výukový program s příklady

  2. Pole AWK vysvětleno na 5 praktických příkladech

  3. Výukový program Ultimate Bash Array s 15 příklady