Co rozumiesz jako tablice zmiennych?
AoA - array of arrays (tablice wielowymiarowe)
AoH - Array of hashes
HoA - Hash of arrays
HoH - Hash of hashes
?
W perlu mozesz sobie stworzyc dowolna strukture... Tworzenie robi sie bardzo prosto - zwyczajnie umieszczasz w tablicy jako kolejny element odwolanie (cos jak pointer w C) do zmiennej - niezaleznie od jej typu.
Kod:
my %ludziska = ( 'user1' => 'ala', 'user2' => 'ola', user3 => 'ula');
my @pliki = ('raport.pdf', 'raport.doc', 'raport.txt');
my $skalar = 'cokolwiek';
my $skalar2 = 123456;
Zmienne zadeklarowane - teraz czytamy:
Kod:
print "User1 to $ludziska{'user1'}\n";
print "User1 to $ludziska{user1}\n"; # te 2 linie zwroca do tamo
print "Plik 1 to $pliki[1]\n"; # czyli raport.doc - numeracja idzie od 0 nie od 1
print "Skalar to $skalar a drugi to $skalar2\n"; # nie trzeba
#konwertowac liczb na stringi - perl sam wie co chcesz zrobic
To teraz poskladajmy calosc w jedna tablice po kolei:
Kod:
my @smietnik = (\%ludziska, \@pliki, \$skalar, \$skalar2);
Efekt jest taki, ze mamy tablice a w niej zebrane wszystkie inne struktury danych Mozemy sie teraz do tego odwolac tak:
Kod:
print "user1 to $smietnik[0]->{user1}"; # ala
print "plik1 to $smietnik[1]->[1]"; # raport.doc
print "skalar1 to ${$smietnik[2]}"; # tak tez mozna - znaczy sie odczytaj
# skalar opisany o nazwie $smietnik[2]
# mozna zapisac tez jako $$smietnik[2] ale z {} jest czytelniej
Mam nadzieje ze chodzilo o cos mniej wiecej w tym stylu. Cala sztuka polega na tym, ze przekazujac parametry do funkcji ktora napisales moze uzyc zmiennych globalnych, mozesz przekazac jako parametry (nawet okreslajac tzw prototypy) albo jesli sa bardziej skomplikowane, mozesz przekazac je jako referencje...
Kod:
sub dzialaj {
# wywolanie jako: dzialaj(\@smietnik);
my $smietnik_ref = $_[0]; #pierwszy parametr
print "User1 to $smietnik_ref->[0]->{user1}\n";
}
Tak przekazalem obiekt z cala struktura... Moge ja zmieniac, itd.
Jesli nie jestes pewien swojej struktury jak ona wyglada, to polecam:
Kod:
use Data::Dumper;
print "DEBUG - struktura danych\n";
print Dumper @smietnik;
print Dumper \@smietnik; #porownaj wyniki tych 2