sivut.web

ohjeita web-sivuston tekijälle

Perl-opas: Assosiatiiviset taulukot

Yleistä

Tavalliset taulukot sallivat pääsyn elementteihinsä numeron avulla. Taulukon @food ensimmäinen elementti on $food[0], toinen vastaavasti $food[1] jne. Perl sallii myös luoda taulukoita, joiden elementteihin päästään merkkijonon avulla. Näitä kutsutaan assosiatiiveiksi taulukoiksi (associative arrays).

Haluttaessa määritellä tällainen taulukko käytetään sulkuja, mutta itse taulukon nimen ensimmäinen merkki on %. Esimerkiksi:

%ages = ("Michael Caine", 39, "Dirty Den", 34, "Angie", 27, "Willy", "21 in dog years", "The Queen Mother", 108);

Nyt ikä saadaan selville seuraavasti:

$ages{"Michael Caine"};    palauttaa 39 
$ages{"Dirty Den"};        palauttaa 34 
$ages{"Angie"};            palauttaa 27 
$ages{"Willy"};            palauttaa "21 in dog years" 
$ages{"The Queen Mother"}; palauttaa 108 

Huomaa, että kuten tavallisten taulukoidenkin tapauksessa jokainen % -merkki on muuttunut dollarimerkiksi koska yksittäiset elementit ovat skalaareita. Taulukoista poiketen indeksi, tässä tapauksessa henkilön nimi, sijoitetaan aaltosulkeisiin.

Assosiatiiviset taulukot voidaan muuttaa takaisin tavalliseksi taulukoksi merkitsemällä se tavallisen taulukon arvoksi ja päinvastoin. Ideaalitapauksessa tavallisessa taulukossa on parillinen määrä elementtejä:

@info = %ages;     @info on taulukko, jolla on 10 elementtiä 
$info[5];          palauttaa taulukon @info viidennen arvon, joka on 27 
%moreages = @info; %moreages on assosiatiivinen taulukko, joka on sama kuin %ages

Operaattorit

Assosiatiivisen taulukon elementeillä ei ole mitään järjestystä, mutta on mahdollista päästä käsiksi kaikkiin elementteihin vuorollaan käyttäen keys- ja values -funktioita:

foreach $person (keys %ages)
{
  print "I know the age of $person\n";
}
foreach $age (values %ages)
{
  print "Somebody is $age\n";
} 

Kun keys-funktiota kutsutaan se palauttaa listan taulukon avaimista ( keys ), jotka ovat taulukon indeksejä. Kutsuttaessa funktiota values palautetaan taulukon arvot listana. Nämä funktiot palauttavat listansa samassa järjestyksessä, mutta sillä ei ole mitään tekemistä tietojen syöttöjärjestyksen kanssa. Kutsuttaessa fuktioita keys ja values skalaarikontekstissa ne palauttavat avain/arvo ( key/value ) parien lukumäärän associative array: ssa. On myös funktio each, joka palauttaa kahdesta elementistä koostuvan listan, jonka elementit ovat avain ja sen arvo. Joka kerta kun each-funktiota kutsutaan se palauttaa seuraavan avain/arvo-parin kunnes kaikki on käyty läpi:

while (($person, $age) = each(%ages))
{
print "$person is $age\n";
} 

Seuraava sivu: Operaattorit.


Käyttäjien kommentit

9.6.2004 11:26
Mikko Lipasti <pasti at iki dot fi>

Perlissä operaattorit "," eli pilkku ja "=>" eli oikealle osoittava nuoli ovat toistensa synonyymejä. Useimmiten assosiatiivisten taulukoiden yhteydessä näkee käytettävän näitä vuorotellen seuraavaan tapaan:

%Kaverit = ( "Kalle" => "Kiva", "Ville" => "Hassu" );

mikä on siis perlin kannalta täsmälleen sama kuin kirjoittajan käyttämä notaatiotyyli

%Kaverit = ( "Kalle", "Kiva", "Ville", "Hassu" );

mutta assosiatiivisuus on mielestäni helpommin luettavissa ensimmäisestä muodosta.

3.1.2006 14:19
JT

Kiitos selvityksestä assosiatiivista taulukoista, erittäin valaiseva :)

Lisää oma kommentti


Ari Paulin
ari.paulin@pp.htv.fi
http://www.pp.htv.fi/apaulin/