_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/keys - gražina sąrašą indeksų iš hash'o
  • keys HASH

    Gražina sąrašą, susidedantį iš visų raktų įvardintos maišos (hash). (Skaliariniame kontekste gražina raktų kiekį.)

    Raktai yra gražinami akivaizdžiai atsitiktine tvarka. Tikroji atsitiktinė tvarka ruošiasi keisis, bet garantuotai tokia pati tvarka bus kaip kad ją duoda values arba each funkcijos (turint omeny kad hash'as nebuvo modifikuotas). Nuo Perl 5.8.1 eiliškumas yra skirtingas netgi tarp skirtingų Perl paleidimų. Tai yra saugumo labui (žr. "Algorithmic Complexity Attacks" perlsec'e).

    Kaip šalutinis efektas, keys() iškvietimas atstato (reset) HASH vidinį iteratorių, žr. each. (Ypač tai svarbu, kai keys() kviečiamas void kontekste - jis atstato iteratorių nieko nepirdėdamas).

    Čia yra dar vienas būdas kaip išvesti aplinkai:

        @keys = keys %ENV;
        @values = values %ENV;
        while (@keys) {
    	print pop(@keys), '=', pop(@values), "\n";
        }

    arba sueiliuotą pagal raktą:

        foreach $key (sort(keys %ENV)) {
    	print $key, '=', $ENV{$key}, "\n";
        }

    Gražintos reikšmės yra originalių raktų hash'e kopijos, taigi jų modifikavimas nepaveiks originalaus hash'o. Palyginimui values.

    Išrikiuoti hash pagal reikšmę, reikės panaudoti sort funkciją. Štai hash'o rikiavimas mažėjančia skaitine tvarka pagal reikšmes:

        foreach $key (sort { $hash{$b} <=> $hash{$a} } keys %hash) {
    	printf "%4d %s\n", $hash{$key}, $key;
        }

    Kaip kairė reikšmė keys leidžia padidinti leidžiamų rikiavimo veiksnių skaičių (hash bucket) duotąjam hash'ui. Jei žinoma, kad hash'as bus didelis, tai gali padidinti efektyvumą. (Panašiai kaip iškart išplečiant masyvą priskiriant didelį skaičių $#array.) Jei sakoma

        keys %hash = 200;

    tai %hash turės bent jau 200 rikiavimo veiksnių tam skirtų - 256 iš tikrųjų, nes apvalinama į didesnįjį dviejų laipsnį. Šie veiksniai bus papildyti net jei darysite %hash = (). Naudokite undef %hash norint atlaisvinti atmintį, kol %hash yra vis dar galiojimo srityje (scope). Negalima sumažinti veiksnių skaičių, priskirtą hash'ui naudojant keys šiuo atveju (bet nereiktų jaudintis, jei padarysite tai atsitiktinai, nes mėginimai tai atlikti šiuo atveju neturi jokio efekto).

    Taip pat žr. each, values ir sort.

algirdas@perl.lt 2005.04.11 - $dabar