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]