plik


ÿþDzisiejszy wykBad Programowanie w Perlu Skupimy si na jednym z najpot|niejszych narzdzi w Perlu  Tablice asocjacyjne oraz funkcje tablicowe na tzw. haszach: omówimy istot haszów sposoby inicjalizacji haszów Marcin Junczys-Dowmunt sposoby dodawania i usuwanie elementów junczys@amu.edu.pl sposoby przegldania haszów WydziaB Matematyki i Informatyki Omówimy powizania midzy haszami i tablicami http://amu.edu.pl/~junczys w tym sortowanie elementów tablic i haszów za pomocsort tworzenie np. haszów z tablic za pomocmap Marcin Junczys-Dowmunt Programowanie w Perlu 1/19 Marcin Junczys-Dowmunt Programowanie w Perlu 2/19 Co to jest hasz? Inicjalizacja haszów 1 my %dzwieki = ( Hasz jest struktur podobn do tablicy, ale zamiast indeksów lew => "grrr", liczbowych hasz u|ywa kluczy pies => "hau", Bardziej skomplikowana nazwa dla haszy to tablice kot => "miau", 5 "tygrys bengalski" => "roar" asocjacyjne, poniewa| kojarz ze sob klucze i warto[ci ); Kluczem hasza mo|e by dowolna warto[ skalarna, czyli liczba, BaDcuch znakowy (lub referencja) print "Lew robi ". $dzwieki{"lew"} ."\n"; Przedrostkiem dla hasza jest znak %, który ma przypomina print "Pies robi ". $dzwieki{pies} ."\n"; 10 print "Kot robi $dzwieki{kot}\n"; par elementów skojarzonych print "Tygrys robi $dzwieki{ tygrys bengalski }\n"; Zamiast nawiasów [] korzystamy z {} przy odwoBywaniu si do warto[ci haszów Kanoniczny sposób inicjalizacji haszów Hasze s jedn z najpot|niejszych i najcz[ciej u|ywanych Kojarzymy ze sob nazwy zwierzt oraz wydawane dzwiki cech Perla Gdy klucz skBada si z samych znaków alfanumerycznych, Pono by programowa w Perlu, trzeba my[le w haszach mo|emy opu[ci cudzysBów Marcin Junczys-Dowmunt Programowanie w Perlu 3/19 Marcin Junczys-Dowmunt Programowanie w Perlu 4/19 Dodawanie elementów do haszów Usuwanie elementów z hasza 1 my %hasz = (klucz1 => 1, klucz2 => 2, klucz3 => 3); # my %hasz = ("klucz", 1, "klucz2", 2, "klucz3", 3); 1 my %oczy; $oczy{kot} = "2"; my $skalar1 = delete $hasz{klucz1}; 5 # $skalar1 rowny 1 @oczy{mrowka, wazka} = (4, "milion"); 5 my $skalar2 = delete @hash{qw(klucz1 klucz2)}; my @stwory = qw(pantofelek, czlowiek, pajak, mucha); # skalar2 rowny 2 @oczy{@stwory} = (0, 2, 8, "duzo za duzo"); 10 @tablica = delete @hash{qw(klucz1 klucz2 klucz3)}; Mo|emy dodawa dowoln liczb elementów do hasza # @tablica rowna (undef, undef, 3) Poniewa| nie ma okre[lonej kolejno[ci elementów w haszu, nie potrzebujemy funkcji typuunshift, push Funkcja wbudowanadeleteusuwa podane elementy z hasza W kontek[cie skalarnym zwraca ostatni usunity element lub Podobnie jak dla tablic istniej wycinki haszów undefje[li element nie istnieje Ka|dy wycinek z hasza jest tablic(!), std przedrostek@ W kontek[cie listowym zwraca list wszystkich usunitych elementów, w tymundef, je[li jaki[ z elementów nie istnieje Marcin Junczys-Dowmunt Programowanie w Perlu 5/19 Marcin Junczys-Dowmunt Programowanie w Perlu 6/19 Sprawdzanie czy element istnieje w haszu Przegldanie haszów - wedBug kluczy 1 my %mity = ( 1 my %slownik = ( yeti => 0, szafa => "rzeczownik", wielki => "przymiotnik", gwiazdor => "", mrugac => "czasownik", krotko => "przyslowek", wilkolak => undef ); 5 ); 5 foreach (keys %slownik) { chomp(my $test = <STDIN>); print "Wyraz $_ to $slownik{$_}\n"; if(exists($mity{$test})) { } print "$test istnieje, wartosc  $mity{$test} \n"; 10 } Funkcja wbudowanakeyszwraca list wszystkich kluczy else { danego hasza print "$test nie istnieje\n"; } Mo|na t list zapisa do zmiennej tablicowej lub u|y w dowolnym kontek[cie listowym Funkcjaexistssprawdza, czy dany element istnieje w haszu Elementy w haszach nie s uporzdkowane, wic lista Istnienie takiej funkcji jest konieczne, poniewa| warto[ zwrócona przezkeyste| nie jest skojarzona z danym kluczem mo|e by logicznym faBszem Marcin Junczys-Dowmunt Programowanie w Perlu 7/19 Marcin Junczys-Dowmunt Programowanie w Perlu 8/19 Przegldanie haszów - wedBug warto[ci Przegldanie haszów - wedBug par kluczy i warto[ci 1 my %slownik = ( 1 my %slownik = ( szafa => "rzeczownik", wielki => "przymiotnik", szafa => "rzeczownik", wielki => "przymiotnik", mrugac => "czasownik", krotko => "przyslowek", mrugac => "czasownik", krotko => "przyslowek", ); ); 5 5 foreach (values %slownik) { while(my ($wyraz, $czesc_mowy) = each %slownik) { print "Slownik zawiera nast. czesci mowy: \n"; print "Wyraz $wyraz to $czesc_mowy\n"; } } Funkcja wbudowanavalueszwraca list wszystkich warto[ci Funkcjaeachw kontek[cie listowym dla podanego hasza danego hasza (odpowiednikkeys) zwraca par klucz-warto[ (czyli list dwuelementow) W przeciwieDstwie do kluczy, warto[ci w haszu mog si Przy ka|dym wywoBaniueachzwraca kolejn par, a| powtarza (hasze s lewostronnie jednoznaczne) zabraknie par w haszu Nie ma bezpo[redniej mo|liwo[ci wy[wietlenia klucza do W kontek[cie skalarnym zwraca jedynie kolejne klucze odpowiedniej warto[ci Marcin Junczys-Dowmunt Programowanie w Perlu 9/19 Marcin Junczys-Dowmunt Programowanie w Perlu 10/19 Hasze - podsumowanie Sortowanie tablic Je[li chcemy uporzdkowa tablic wedBug jakiego[ okre[lonego Hasze to struktury podobne do list, które maj zawsze porzdku korzystamy z funkcjisort parzyst liczb elementów (mo|emy zapisywa tablice do haszów i hasze do tablic) 1 @lista_obecnosci = qw(Zenon Wladek Antek Mirek Edek); print join("\n",sort @lista_obecnosci)."\n"; Hasze mo|na traktowa jak zbiory par klucz-warto[ (zbiór par uporzdkowanych, relacja) Sortowanie dziaBa te| na liczbach Elementy haszów nie s uporzdkowane (tak jak zbiór) 1 @liczby = (4,7,13,9,5,2,10,7); Klucze haszy nie mog si powtarza, próba dodania pary print join(",",sort @liczby)."\n"; klucz-warto[ dla istniejce klucza spowoduj nadpisanie Ale mo|e dziaBa dziwnie dla warto[ci mieszanych poprzedniej warto[ci (relacja lewostronnie jednoznaczna) 1 @mieszane = (4,"Antek",13,9,"Zenon",2,10,"Mirek"); Operator=>jest synonimem przecinka,(operator listowy), print join(",", sort @mieszane)."\n"; dodatkowo wymusza po lewej stronie kontekst BaDcuchowy (nawet gdy klucz jest liczb!) WedBug jakiego porzdku zostaBa posortowana ostatnia lista? Marcin Junczys-Dowmunt Programowanie w Perlu 11/19 Marcin Junczys-Dowmunt Programowanie w Perlu 12/19 Sortowanie tablic - cig dalszy Inne sortowania Funkcjasortmo|e dziaBa wedBug dowolnych porzdków 1 @lista = qw(Waldek Zenek tort Tomek Olga Ala worek); 1 @mieszane = (4,"Antek",13,9,"Zenon",2,10,"Mirek"); print join(",", sort { print join(",",sort @lista)."\n"; $a <=> $b or $a cmp $b print join(",",sort {lc($a) cmp lc($b)} @lista)."\n"; } @mieszane)."\n"; 5 print join(",",sort {lc($b) cmp lc($a)} @lista)."\n"; Kto potrafi wytBumaczy, dlaczego taki zapis porzdkuje w @revlista = reverse sort {lc($a) cmp lc($b)} @lista; obserwowany sposób? print join(",", @revlista)."\n"; Wskazówka: Operator logicznyornie sprawdza wyra|enia po jego prawej stronie, gdy wyra|enie po lewej stronie jest prawdziwe 10 print join(",", sort { length($a) <=> length($b) or $a cmp $b Zmienne $a i $b reprezentuj dwie porównywane warto[ci } @lista)."\n"; sortowanej listy Okre[lajc sposoby porównywania, okre[lamy porzdki print join(",", sort { 15 reverse($a) cmp reverse($b) sortowania } @lista)."\n"; Sortowanie, gdzie liczby poprzedzaj BaDcuchy jest trudniejsze Marcin Junczys-Dowmunt Programowanie w Perlu 13/19 Marcin Junczys-Dowmunt Programowanie w Perlu 14/19 Sortowanie a hasze Funkcjamap- Funkcyjne przetwarzanie tablic 1 my %hasz = ( bb => "zz", aa => "yy", 11 => "xx", ); 1 map { BLOK } LISTA map( WYRAZENIE, LISTA ) 5 print "$_ => $hasz{$_}\n" foreach (sort mysort keys %hasz); Oblicza warto[ w bloku lub wyra|eniu dla ka|dego elementu tablicy (iterowanych za pomoc$) sub mysort { Zwraca list elementów powstaBych przez takie obliczenie return $a <=> $b or $a cmp $b; 10 } W kontek[cie skalarnym zwraca liczb elementów tak wygenerowanych Hasze nie maj okre[lonego porzdku Blok lub wyra|enie s obliczane w kontek[cie skalarnym, mog Za pomoc funkcjisortoraz np.keysmo|emy sobie sami wic zwróci zero, jeden lub kilka elementów okre[li taki porzdek Kryteria sortowania mo|na okre[li we wBasnej funkcji, zmienne$ai$bs standardowo dostpne Marcin Junczys-Dowmunt Programowanie w Perlu 15/19 Marcin Junczys-Dowmunt Programowanie w Perlu 16/19 PrzykBad  generowanie listy odmiany przymiotników PrzykBad  usuwanie powtarzajcych si elementów 1 my @tablica = qw(aa ab bb aa bb ac ab aa); 1 sub generuj { my $adj = shift; my %hasz = map { $_ => 1 } @tablica; return map { @pojedyncze = sort keys %hasz; "$adj$_", "${adj}er$_", "${adj}st$_" 5 5 } qw(er e es en em); print join(" ", @pojedyncze)."\n"; } Funkcjamaptworzy list, w której nieparzyste elementy Funkcjamaptworzy dla ka|dej koDcówki fleksyjnej pochodz z@tablica, parzyste elementy to 1 trzyelementow list (rdzenia przymiotnika w stopniu równym, Przypisanie tej listy do hasza zamienia nieparzyste elementy wy|szym, najwy|szym) na klucze, parzyste na warto[ci hasza Wynikiem jest lista 15-elementowa (3 × 5)  pamitamy, |e W haszu klucze nie mog si powtarza (warto[ci skojarzone z dwie listy w kontek[cie listowym Bcz si w jedn wiksz list istniejcym kluczem zostan nadpisane przez now warto[) Lista jest zwracana za pomocreturn, nie ma potrzeby Tablica skBadajca si z samych kluczy tego hasza jest tablic tworzenia tablicy tymczasowej zawierajca tylko niepowtarzajce si elementy z@tablica Marcin Junczys-Dowmunt Programowanie w Perlu 17/19 Marcin Junczys-Dowmunt Programowanie w Perlu 18/19 Podsumowanie Hasze to jeden z najwa|niejszych mechanizmów w Perlu Bardzo wiele zadaD programistycznych mo|na rozwiza w elegancki sposób za pomoc haszy (zadania domowe) Poznali[my kilka funkcyjnych sposobów przetwarzania list i haszów (wej[ciem do funkcji jest lista, wyj[ciem lista przetworzona) Midzy innymi dziki tym funkcjom skBadnia Perla jest taka zwizBa Zadania wykonywane przez te funkcje zajByby kilka wierszy ka|dym tradycyjnym jzyku programowania Marcin Junczys-Dowmunt Programowanie w Perlu 19/19

Wyszukiwarka

Podobne podstrony:
Wyklad4 handout
Wyklad07 handout
Wyklad3 handout
Wyklad17 handout
Wyklad06 handout
Wyklad2 handout
Wyklad04 2008 handout
Wyklad xmlparse handout
Wyklad1 2008 handout
20151012 MichalTrzesiok Statystyka wyklad2 miary statystyczne handout
Wyklad03 2008 handout
Wyklad2 2008 handout
Wyklad05 2008 handout
20151019 MichalTrzesiok Statystyka wyklad3 analiza korelacji handout
Sieci komputerowe wyklady dr Furtak
Wykład 05 Opadanie i fluidyzacja
AGH Sed 4 sed transport & deposition EN ver2 HANDOUT

więcej podobnych podstron