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
.