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]