Article View: pl.comp.lang.perl
Article #537Re: Kopiowanie tablic hash w PERL'u
From: Piotr Auksztulewicz
Date: Fri, 29 Aug 1997 09:49
Date: Fri, 29 Aug 1997 09:49
102 lines
4082 bytes
4082 bytes
Waldek Grudzien (waldekg@uhc.lublin.pl) wrote:
: On Thu, 28 Aug 1997, Michal Trojnara wrote:
: > Waldek Grudzien wrote:
: > > Niech bedzie dana przykladowa tablica hash'ujaca :
: > > %a = (0=>'a', 1=>'b', 2=>'c')
: > >
: > > Chialbym skopiowac przykladowo dwa pierwsze elementy tej tablicy do
: > > drugiej tablicy (np. %b), tzn. chialbym uzyskac tablice :
: > > %b = (0=>'a', 1=>'b')
: >
: > Ja bym zrobil tak:
: > @temp=%a;
: > $b{$temp[0]}=$temp[1];
: > $b{$temp[2]}=$temp[3];
: >
: > Nie wiem, czy jest to najprostsza metoda, ale ma jedna zalete: dziala.
: Okazalo sie, ze jest jeszcze nastepujaca metoda (minusem jej jest, ze
: mozna obciac tylko koncowe elementy...) :
: %b=(0=>'a',1=>'b',2=>'c');
: $k=0; # ile elementow poczatkowych
: @b1=%b;
: for ($i=0;$i<2-$k;$i++){
: pop(@b1);
: pop(@b1);
: }
: %c=@b1;
UWAGA!!!! Nie ma czegos takiego jak _koncowe elementy_ w tablicy asocjacyjnej.
Tablica asocjacyjna (dokladniej: tablica mieszajaca (hash table)) nie
zachowuje porzadku elementow, tak jak zwykla tablica. Po prostu wrzuca nowy
element do pewnej przegrodki wedlug wartosci funkcji mieszajacej, ktora
powinna byc (i jest) tak skonstruowana, aby rozklad byl mozliwie rownomierny.
Mozna wiec z punktu widzenia uzytkownika takiej tablicy powiedziec, ze nowy
element trafia do losowo wybranej przegrodki.
Takie przypisanie w Perlu:
@tablica = %cos;
Powoduje umieszczenie w @tablicy par {klucz, wartosc} w losowej (z punktu
widzenia programisty) kolejnosci. Problem postawiony na wstepie nie ma wiec
zbyt wielkiego sensu.
Poza tym:
1.
Jaki ma sens umieszczanie w %hashu takich par: 1 => 'a', 2 => 'b' itd ?
Nie lepiej wrzucic to do zwyklej tablicy np. @t = [ '', 'a', 'b' ] (itd)
i odwolywac sie $t[1] zamiast $hash{1} ?
2.
Jesli dobrze zgadlem, to chcesz wyrzucic elementy o najwyzszych kluczach.
Wowczas wystarczy sort keys %hash zeby dostac _uporzadkowana_ liste kluczy;
wtedy ma to jakis sens, bo nie wyrzucasz z tablicy _losowych_ elementow, tylko
np. najwieksze albo najmniejsze zgodnie z jakas tam zasada. Oczywiscie
kryterium 'wiekszosci' moze byc dowolne - wystarczy zapisac np. tak:
sort { $b <=> $a } keys %hash # odwrotny porzadek numeryczny
sort { $a cmp $b } keys %hash # porzadek leksykograficzny (default)
Kod wybierajacy z %hasha k elementow o najnizszych (numerycznie) kluczach
moze wygladac np. tak:
%b = ( 0 => 'a', 1 => 'b', 3 => 'c', 80 => 'z', 1997 => 'X', 15 => 'k' );
$k = 4;
@b1 = (sort {$a <=> $b} keys %b)[0..$k-1];
for (@b1) {
$c{$_} = $b{$_};
}
Teraz w %c sa cztery elementy o kluczach 0, 1, 3 i 15.
3.
Taki for:
for ($i=0; $i<5; $i++)
jest oczywiscie poprawny, ale to nalecialosc z C. Duzo bardziej przejrzysty
i zwiezly jest np. taki zapis:
for $i (0..4)
A nawet (jesli nie korzysta sie z wartosci 'zmiennej sterujacej', a petla
jest tylko dla wymuszenia ilus tam powtorzen):
for (0..4)
lub lepiej
for (1..5)
Wowczas od razu widac, ze chodzi tylko o to, zeby wykonac kawalek kodu 5 razy.
Rada (dla W.G.): napisz co _naprawde_ chcesz zrobic to sie znajdzie jakies
rozwiazanie.
--
Piotr Auksztulewicz piotras@zeus.polsl.gliwice.pl
Centrum Komputerowe Politechniki Slaskiej, Gliwice, Akademicka 16
Technical Details
Message-ID:
<5u6603$crl@zeus.polsl.gliwice.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!agh.edu.pl!polsl.gliwice.pl!zeus.polsl.gliwice.pl!piotrasReferences:
<Pine.HPP.3.96.970828085854.17637A-100000@clinicom.uhc.lublin.pl> <34053C56.368F78D8@ddc.daewoo.com.pl> <Pine.HPP.3.96.970828132020.19769A-100000@clinicom.uhc.lublin.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!agh.edu.pl!polsl.gliwice.pl!zeus.polsl.gliwice.pl!piotras From: piotras@zeus.polsl.gliwice.pl (Piotr Auksztulewicz) Newsgroups: pl.comp.lang.perl,pl.comp.www Subject: Re: Kopiowanie tablic hash w PERL'u Followup-To: pl.comp.lang.perl,pl.comp.www Date: 29 Aug 1997 09:49:55 GMT Organization: Politechnika Slaska, Gliwice Lines: 102 Message-ID: <5u6603$crl@zeus.polsl.gliwice.pl> References: <Pine.HPP.3.96.970828085854.17637A-100000@clinicom.uhc.lublin.pl> <34053C56.368F78D8@ddc.daewoo.com.pl> <Pine.HPP.3.96.970828132020.19769A-100000@clinicom.uhc.lublin.pl> NNTP-Posting-Host: zeus.polsl.gliwice.pl X-Newsreader: TIN [version 1.2 PL2] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit