PERL: Referencje i dereferencje

Gdy skrypty w Perlu zaczynają się rozbudowywać, ilość zmiennych (np. konfiguracyjnych) zaczyna rosnąć. Czasem nie wiadomo też ile oraz jakie one będą.
Na dużą ilość danych pomocne są tablice.
Gdy duże tablice trzeba przekazać do funkcji ratują nas referencje.
Gdy nie tylko danych mamy dużo ale i zmiennych, warto wesprzeć się również HASH-ami i ich referencjami.


Zwykła tablica:

@array =  (“jeden”,”dwa”,”trzy”,”cztery”);

Referencja do tej tablicy:

$array_ref = \@array;

W trakcie debug-owania dobrym pomysłem jest wypisywanie zawartości referencji w celu sprawdzenia czy dwie różne referencje (np. wewnątrz dwóch różnych funkcji) wskazują na tą samą tablicę:

print "$array_ref";

daje w efekcie:

ARRAY(0x1a2b3c)

można też sprawdzić adres tablicy przed utworzeniem referencji:

print \@array."\n";

… oraz przekazać tablicę przez referencję do funkcji:

funkcja ( \@array );

Odbierając wewnątrz funkcji referencję, by używać tablicy musimy stosować dereferencję, poprzez dodanie symbolu tablicy ‘@’ przed zmienną:

sub funkcja {
    my $new_array_ref = shift;
    pop @$new_array_ref;
}

…Przekazanie do funkcji referencji tablicy pozwala nam zmieniać rzeczywiste wartości tej tablicy – zmiana będzie widoczna w programie po zakończeniu działania funkcji.

Można również utworzyć tablicę tablic.
Zaczynamy od podtablic:

@A = (1,2,3);
@B = (11,12,13);
@C = (31,32,33);

I dalej łączymy je w jedną dużą tablicę.

@Z = (\@A, \@B, \@C);

Wydobyć zawartość takiej wielowymiarowej tablicy możemy na dwa sposoby:

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

W przypadku gdy wymiarów mamy jeszcze więcej, po strzałce (->) wybór elementu z każdego kolejnego możemy możemy dodawać w kolejnych nawiasach kwadratowych.

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

P.S.
Podobnie postępujemy z HASH-ami. Należy pamiętać jedynie, że zamiast nawiasów kwadratowych stosuje klamrowe (‘{‘ i ‘}’).


About this entry