🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.perl
9 messages
9 total messages Started by Waldek Grudzien Thu, 28 Aug 1997 07:10
Kopiowanie tablic hash w PERL'u
#531
Author: Waldek Grudzien
Date: Thu, 28 Aug 1997 07:10
22 lines
1238 bytes
Mam pewien klopot :

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')

Probowalem tego na rozne sposoby (petla, push, zakresy ...), ale albo
mialem syntax'a albo efekt nie byl taki jak trzeba.

Zna ktos sposob na rozwiazanie tego hipertrudnego problemu... ?

Lacze pozdrowienia,
                              Waldek Grudzien

    ///////////////////////////////////////////
   //       Lublin/Lubartow, Poland         //
   \\       University Health Care          \\
    \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Re: Kopiowanie tablic hash w PERL'u
#532
Author: Michal Trojnara
Date: Thu, 28 Aug 1997 08:52
19 lines
1285 bytes
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.

-- 
| E-mail -> mailto:mtrojnar@ddc.daewoo.com.pl   | Michal  Trojnara |
| Strona -> http://www.daewoo.com.pl/~mtrojnar/ |   090-29-83-44   |
| CHSI   -> http://www.chsi.rubikon.net.pl/     | Jezus jest Panem |
Re: Kopiowanie tablic hash w PERL'u
#533
Author: Waldek Grudzien
Date: Thu, 28 Aug 1997 11:23
36 lines
1766 bytes
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;

Pozdrawiam,
                              Waldek Grudzien

    ///////////////////////////////////////////
   //       Lublin/Lubartow, Poland         //
   \\       University Health Care          \\
    \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Re: Kopiowanie tablic hash w PERL'u
#534
Author: Ziemek Borowski
Date: Thu, 28 Aug 1997 11:41
7 lines
983 bytes
>> Waldek Grudzien wrote:
>> > Niech bedzie dana przykladowa tablica hash'ujaca :
>> > %a = (0=>'a', 1=>'b', 2=>'c')
a co to ma wspólnego z WWW w Polsce i po polsku? 

-- Ziemek Borowski
http://www.digilab.com.pl/pl.comp.www/
Re: Kopiowanie tablic hash w PERL'u
#536
Author: Michal Trojnara
Date: Thu, 28 Aug 1997 12:05
34 lines
1729 bytes
Waldek Grudzien wrote:
> 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;

Jesli zastapisz pop przez shift, to beda elementy
koncowe...  8-)

Jesli tak, to mozna prosciej, szybciej i elastyczniej:

%b=(0=>'a',1=>'b',2=>'c');
$begin=0;
$end=1;
@temp=%b;
%c=@temp[2*$begin .. 2*$end+1];

Nasuwa sie tylko pytanie o sens takiej operacji:
O ile wiem Perl nie definiuje implementacji tablic
asocjacyjnych: czy mozna gwarantowac, ze wartosc
nowo dodana %x faktycznie znajduje sie w jakims
konkretnym miejscu tej tablicy (np. na koncu)?

-- 
| E-mail -> mailto:mtrojnar@ddc.daewoo.com.pl   | Michal  Trojnara |
| Strona -> http://www.daewoo.com.pl/~mtrojnar/ |   090-29-83-44   |
| CHSI   -> http://www.chsi.rubikon.net.pl/     | Jezus jest Panem |
Re: Kopiowanie tablic hash w PERL'u
#535
Author: Waldek Grudzien
Date: Thu, 28 Aug 1997 12:55
18 lines
1458 bytes
On 28 Aug 1997, Ziemek Borowski wrote:

> >> Waldek Grudzien wrote:
> >> > Niech bedzie dana przykladowa tablica hash'ujaca :
> >> > %a = (0=>'a', 1=>'b', 2=>'c')
> a co to ma wspólnego z WWW w Polsce i po polsku? 
> 

Popatrz, a ja myslalem do tej pory, ze duzo dynamicznych (polskich ?)
stron WWW robionych jest w PERL'u - o wybacz za te pomylke ... kajam
sie...

                              Waldek Grudzien

    ///////////////////////////////////////////
   //       Lublin/Lubartow, Poland         //
   \\       University Health Care          \\
    \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Re: Kopiowanie tablic hash w PERL'u
#539
Author: Piotr Budrewicz
Date: Thu, 28 Aug 1997 13:41
29 lines
1724 bytes
On Thu, 28 Aug 1997, 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')

  A tak wlasciwie to o co Ci chodzi? Co chcesz uzyskac? Na podstawie tego
przykladu trudno jest to ustalic, a metoda powinna byc dostosowana do
zadania...

  Chetnie pomoge, tylko napisz co chcesz zrobic w ogole, a nie w tym
przypadku.

    pozdrawiam

      Piotr Budrewicz

P.S.

  BTW: Dobrze, ze nie wyslales na pl.rec.ksiazki - przeciez o perlu tez
sie pisze ksiazki...

Piotr Dominik Budrewicz  | "Knocking him down won the first fight. I wanted
Wa-wa, Batorego 27 m. 24 |  to win all the next ones, too. So they'd leave
tel. (022)25-53-34       |  me alone."
e-mail: pdb@irc.pl.      |     Ender Wiggin -- `Ender's game' - Orson Scot Card
Re: Kopiowanie tablic hash w PERL'u
#537
Author: Piotr Auksztulewicz
Date: Fri, 29 Aug 1997 09:49
102 lines
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
Re: Kopiowanie tablic hash w PERL'u
#538
Author: Piotr Budrewicz
Date: Fri, 29 Aug 1997 12:54
27 lines
2021 bytes
On 29 Aug 1997, Piotr Auksztulewicz wrote:

> 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.

  [ z cichym podziwem kasuje caly komentarz ] 

  Wlasnie o to mi chodzilo, kiedy prosilem W.G. zeby napisal co _naprawde_
chce zrobic. :-) Na szczescie (dla W.G.) nie wszyscy sa tak leniwi jak
ja. 

> Rada (dla W.G.): napisz co _naprawde_ chcesz zrobic to sie znajdzie jakies
> rozwiazanie.
  
    pozdrawiam

     Piotr Budrewicz

Piotr Dominik Budrewicz  | "Knocking him down won the first fight. I wanted
Wa-wa, Batorego 27 m. 24 |  to win all the next ones, too. So they'd leave
tel. (022)25-53-34       |  me alone."
e-mail: pdb@irc.pl.      |     Ender Wiggin -- `Ender's game' - Orson Scot Card
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads