Dzisiejszy wykład. Programowanie w Perlu. Co to jest hasz? Inicjalizacja haszów

Podobne dokumenty
Programowanie 2. Perl - Tablice asocjacyjne oraz funkcje tablicowe. Marcin Junczys-Dowmunt

Dzisiejszy wykład. Narzędzia informatyczne w językoznawstwie Perl- Tablice asocjacyjne oraz funkcje tablicowe. Cotojesthasz? Inicjalizacja haszów

Narzędzia informatyczne w językoznawstwie

Narzędzia informatyczne w językoznawstwie

Dzisiejszy wykład. Narzędzia informatyczne w językoznawstwie. Usuwanie elementów z początku tablicy. Dodawanie elementów do początku tablic

Dzisiejszy wykład. Programowanie w Perlu. Usuwanie elementów z początku tablicy. Dodawanie elementów do początku tablic

Systemy operacyjne. Laboratorium 8. Perl find

Wyrażenia regularne w Perlu. Narzędzia informatyczne w językoznawstwie. Przykład bardziej sensowny perlowy minigrep.pl. Pierwsze przykłady

KARTA KURSU. Języki skryptowe

Tworzenie stron internetowych z wykorzystaniem HTM5, JavaScript, CSS3 i jquery. Łukasz Bartczuk

Lekcja 1. Składnia języka zmienne i podstawowe instrukcje PHP. Do wyświetlania tekstu służy instrukcja echo echo Hello world ;

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Języki formalne i automaty Ćwiczenia 6

Serwer WWW Apache. Plik konfiguracyjny httpd.conf Definiujemy m.in.: Aktualne wersje 2.4.6, , zakończony projekt

Podstawy Informatyki i algorytmizacji

Pożyteczne linki: PERL Practical Extraction and Report Language

PERL Practical Extraction and Report Language

Programowanie w języku Python. Grażyna Koba

PHP: bloki kodu, tablice, obiekty i formularze

Listy, krotki, słowniki, funkcje

Warsztaty dla nauczycieli

Programowanie robota mobilnego E-puck w języku Python

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Sortowanie topologiczne skierowanych grafów acyklicznych

Narzędzia informatyczne w językoznawstwie

Systemy operacyjne. Laboratorium 9. Perl wyrażenia regularne. Jarosław Rudy Politechnika Wrocławska 28 lutego 2017

Tablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119

1 Podstawy c++ w pigułce.

Instrukcje. Operatory. Operatory. Instrukcje sterujące. wyrażenie1 && wyrażenie2 ;

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Python. Skąd taka nazwa? Kurs systemu UNIX 1

Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Programowanie obiektowe

Bash - wprowadzenie. Bash - wprowadzenie 1/39

1 Podstawy c++ w pigułce.

Instrukcje sterujące. wer. 11 z drobnymi modyfikacjami! Wojciech Myszka :53:

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Lekcja 7 Tablice. Definiowanie tablicy

Wstęp do programowania

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Stuck in the loop. Sterowanie. Marcin Makowski. 29 października Zak lad Chemii Teoretycznej UJ

Algorytmy i struktury danych. Wykład 6 Tablice rozproszone cz. 2

lekcja 8a Gry komputerowe MasterMind

Wstęp do programowania

Pracownia Informatyczna Instytut Technologii Mechanicznej Wydział Inżynierii Mechanicznej i Mechatroniki. Podstawy Informatyki i algorytmizacji

while(wyrażenie) instrukcja

Paradygmaty programowania

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

Funkcje są prawdopodobnie najważniejszą częścią każdego poważnego programu (w każdym języku programowania).

Generacja kodu docelowego

Elementem tablicy może być każdy typ zmiennej (z innymi tablicami i obiektami włącznie). Tablica dwuwymiarowa, zawiera dwa indeksy, np.

JS:Obiekty, tablice, JSON

Systemy operacyjne. Laboratorium 7. Perl podstawy. Jarosław Rudy Politechnika Wrocławska 27 kwietnia 2017

Wykład 3 Składnia języka C# (cz. 2)

Programowanie w C++ Wykład 6. Katarzyna Grzelak. 1 kwietnia K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43

QUERY język zapytań do tworzenia raportów w AS/400

Języki programowania wysokiego poziomu. PHP cz.2.

Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.

Podstawy Informatyki i algorytmizacji

Wstęp do programowania

Podstawowe algorytmy i ich implementacje w C. Wykład 9

DANE TEKSTOWE W JĘZYKU C/C++ - TABLICE ZNAKOWE

Perl a XML. Narzędzia informatyczne w językoznawstwie. Generowanie danych XML - Przykład. Generowanie danych XML. Perl - Przetwarzanie XML

Modelowanie rynków finansowych z wykorzystaniem pakietu R

Programowanie komputerowe. Zajęcia 4

Przykład powyżej pokazuje, że w zapytaniu można umieszczać funkcje zarówno zdefiniowane w ramach środowiska, jak również własne.

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Wstęp do wskaźników w języku ANSI C

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

Programowanie w Ruby

Zmienne powłoki. Wywołanie wartości następuje poprzez umieszczenie przed nazwą zmiennej znaku dolara ($ZMIENNA), np. ZMIENNA=wartosc.

ŁAŃCUCHY W JĘZYKU C/C++

Technologie baz danych

Hash jest strukturą danych, która przechowuje pary oraz umożliwia dostęp do wartości poprzez podanie klucza.

dr inż. Jarosław Forenc

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

METODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH

Podstawy bioinformatyki 2017/18

Ćwiczenie zapytań języka bazy danych PostgreSQL

LibreOffice Calc VBA

Liczby losowe i pętla while w języku Python

Wykład 4. Klasa List Kolejki Stosy Słowniki

Warunki logiczne instrukcja if

Algorytmy i struktury danych

Podstawy Programowania C++

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

Programowanie w C++ Wykład 7. Katarzyna Grzelak. 23 kwietnia K.Grzelak (Wykład 7) Programowanie w C++ 1 / 40

Podstawy technologii WWW

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Algorytmy sortujące i wyszukujące

Wstęp do programowania

Pętle w PERLU postać ogólna

Podstawy programowania. Podstawy C# Tablice

Elementy metod numerycznych - zajęcia 9

Test przykładowy 2 PAI WSB Wrocław /06/2018

MS Excel 2007 Kurs zaawansowany Obsługa baz danych. prowadzi: Dr inż. Tomasz Bartuś. Kraków:

Transkrypt:

Dzisiejszy wykład Programowanie w Perlu Tablice asocjacyjne oraz funkcje tablicowe Marcin Junczys-Dowmunt junczys@amu.edu.pl Wydział Matematyki i Informatyki http://amu.edu.pl/~junczys Skupimy się na jednym z najpotężniejszych narzędzi w Perlu na tzw. haszach: omówimy istotę haszów sposoby inicjalizacji haszów sposoby dodawania i usuwanie elementów sposoby przeglądania haszów Omówimy powiązania między haszami i tablicami w tym sortowanie elementów tablic i haszów za pomocą sort tworzenie np. haszów z tablic za pomocą map Marcin Junczys-Dowmunt Programowanie w Perlu 1/19 Marcin Junczys-Dowmunt Programowanie w Perlu 2/19 Co to jest hasz? Inicjalizacja haszów Hasz jest strukturą podobną do tablicy, ale zamiast indeksów liczbowych hasz używa kluczy Bardziej skomplikowana nazwa dla haszy to tablice asocjacyjne, ponieważ kojarzą ze sobą klucze i wartości Kluczem hasza może być dowolna wartość skalarna, czyli liczba, łańcuch znakowy (lub referencja) Przedrostkiem dla hasza jest znak %, który ma przypominać parę elementów skojarzonych Zamiast nawiasów [] korzystamy z { przy odwoływaniu się do wartości haszów Hasze są jedną z najpotężniejszych i najczęściej używanych cech Perla Ponoć by programować w Perlu, trzeba myśleć w haszach 1 my % dzwieki = ( lew => " grrr ", pies => " hau ", kot => " miau ", " tygrys bengalski " = > " roar " print " Lew robi ". $dzwieki {" lew "."\n"; print " Pies robi ". $dzwieki { pies."\n"; 10 print " Kot robi $dzwieki { kot \n"; print " Tygrys robi $dzwieki { tygrys bengalski \ n"; Kanoniczny sposób inicjalizacji haszów Kojarzymy ze sobą nazwy zwierząt oraz wydawane dźwięki Gdy klucz składa się z samych znaków alfanumerycznych, możemy opuścić cudzysłó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 % oczy ; $oczy { kot = "2"; @oczy { mrowka, wazka = (4, " milion " my @ stwory = qw( pantofelek, czlowiek, pajak, mucha @oczy { @stwory = (0, 2, 8, " duzo za duzo " Możemy dodawać dowolną liczbą elementów do hasza Ponieważ nie ma określonej kolejności elementów w haszu, nie potrzebujemy funkcji typu unshift, push Podobnie jak dla tablic istnieją wycinki haszów Każdy wycinek z hasza jest tablicą(!), stąd przedrostek @ Marcin Junczys-Dowmunt Programowanie w Perlu /19 1 my % hasz = ( klucz1 => 1, klucz2 => 2, klucz3 => 3 # my % hasz = (" klucz ", 1, " klucz2 ", 2, " klucz3 ", 3 my $skalar1 = delete $hasz { klucz1 ; # $skalar1 rowny 1 my $skalar2 = delete @ hash { qw( klucz1 klucz2 # skalar2 rowny 2 10 @ tablica = delete @ hash { qw( klucz1 klucz2 klucz3 # @ tablica rowna ( undef, undef, 3) Funkcja wbudowana delete usuwa podane elementy z hasza W kontekście skalarnym zwraca ostatni usunięty element lub undef jeśli element nie istnieje W kontekście listowym zwraca listę wszystkich usuniętych elementów, w tym undef, jeśli jakiś z elementów nie istnieje Marcin Junczys-Dowmunt Programowanie w Perlu 6/19 Sprawdzanie czy element istnieje w haszu Przeglądanie haszów - według kluczy 1 my % mity = ( yeti => 0, gwiazdor => "", wilkolak = > undef chomp ( my $test = < STDIN > if( exists ( $mity { $test )) { print " $test istnieje, wartosc $mity { $test \n"; 10 else { print " $test nie istnieje \ n"; Funkcja exists sprawdza, czy dany element istnieje w haszu Istnienie takiej funkcji jest konieczne, ponieważ wartość skojarzona z danym kluczem może być logicznym fałszem foreach ( keys % slownik ) { print " Wyraz $_ to $slownik {$_ \n"; Funkcja wbudowana keys zwraca listę wszystkich kluczy danego hasza Można tę listę zapisać do zmiennej tablicowej lub użyć w dowolnym kontekście listowym Elementy w haszach nie są uporządkowane, więc lista zwrócona przez keys też nie jest Marcin Junczys-Dowmunt Programowanie w Perlu 7/19 Marcin Junczys-Dowmunt Programowanie w Perlu 8/19

Przeglądanie haszów - według wartości Przeglądanie haszów - według par kluczy i wartości foreach ( values % slownik ) { print " Slownik zawiera nast. czesci mowy : \ n"; Funkcja wbudowana values zwraca listę wszystkich wartości danego hasza (odpowiednik keys) W przeciwieństwie do kluczy, wartości w haszu mogą się powtarzać (hasze są lewostronnie jednoznaczne) Nie ma bezpośredniej możliwości wyświetlenia klucza do odpowiedniej wartości while ( my ( $wyraz, $czesc_ mowy ) = each % slownik ) { print " Wyraz $wyraz to $czesc_ mowy \ n"; Funkcja each w kontekście listowym dla podanego hasza zwraca parę klucz-wartość (czyli listę dwuelementową) Przy każdym wywołaniu each zwraca kolejną parę, aż zabraknie par w haszu W kontekście skalarnym zwraca jedynie kolejne klucze Marcin Junczys-Dowmunt Programowanie w Perlu 9/19 Marcin Junczys-Dowmunt Programowanie w Perlu 10/19 Hasze - podsumowanie Sortowanie tablic Hasze to struktury podobne do list, które mają zawsze parzystą liczbę elementów (możemy zapisywać tablice do haszów i hasze do tablic) Hasze można traktować jak zbiory par klucz-wartość (zbiór par uporządkowanych, relacja) Elementy haszów nie są uporządkowane (tak jak zbiór) Klucze haszy nie mogą się powtarzać, próba dodania pary klucz-wartość dla istniejące klucza spowodują nadpisanie poprzedniej wartości (relacja lewostronnie jednoznaczna) Operator => jest synonimem przecinka, (operator listowy), dodatkowo wymusza po lewej stronie kontekst łańcuchowy (nawet gdy klucz jest liczbą!) Jeśli chcemy uporządkować tablicę według jakiegoś określonego porządku korzystamy z funkcji sort 1 @ lista_ obecnosci = qw( Zenon Wladek Antek Mirek Edek print join ("\n",sort @lista_obecnosci )."\n"; Sortowanie działa też na liczbach 1 @liczby = (4,7,13,9,,2,10,7 print join (",",sort @liczby )."\n"; Ale może działać dziwnie dla wartości mieszanych 1 @mieszane = (4," Antek ",13,9," Zenon ",2,10," Mirek " print join (",", sort @mieszane )."\n"; Według jakiego porządku została posortowana ostatnia lista? Marcin Junczys-Dowmunt Programowanie w Perlu 11/19 Marcin Junczys-Dowmunt Programowanie w Perlu 12/19

Sortowanie tablic - ciąg dalszy Funkcja sort może działać według dowolnych porządków 1 @mieszane = (4," Antek ",13,9," Zenon ",2,10," Mirek " print join (",", sort { $a <= > $b or $a cmp $b @mieszane )."\n"; Kto potrafi wytłumaczyć, dlaczego taki zapis porządkuje w obserwowany sposób? Wskazówka: Operator logiczny or nie sprawdza wyrażenia po jego prawej stronie, gdy wyrażenie po lewej stronie jest prawdziwe Zmienne $a i $b reprezentują dwie porównywane wartości sortowanej listy Określając sposoby porównywania, określamy porządki sortowania Sortowanie, gdzie liczby poprzedzają łańcuchy jest trudniejsze Inne sortowania 1 @ lista = qw( Waldek Zenek tort Tomek Olga Ala worek print join (",",sort @lista )."\n"; print join (",",sort {lc($a) cmp lc($b ) @lista )."\n"; print join (",",sort {lc($b) cmp lc($a ) @lista )."\n"; @revlista = reverse sort {lc($a) cmp lc($b ) @lista ; print join (",", @revlista )."\n"; 10 print join (",", sort { length ($a) <=> length ($b) or $a cmp $b @lista )."\n"; print join (",", sort { 1 reverse ($a) cmp reverse ($b) @lista )."\n"; Marcin Junczys-Dowmunt Programowanie w Perlu 13/19 Marcin Junczys-Dowmunt Programowanie w Perlu 14/19 Sortowanie a hasze Funkcja map - Funkcyjne przetwarzanie tablic 1 my % hasz = ( bb => "zz", aa => "yy", 11 => "xx", print "$_ => $hasz {$_ \n" foreach ( sort mysort keys % hasz sub mysort { return $a <= > $b or $a cmp $b; 10 Hasze nie mają określonego porządku Za pomocą funkcji sort oraz np. keys możemy sobie sami określić taki porządek Kryteria sortowania można określić we własnej funkcji, zmienne $a i $b są standardowo dostępne 1 map { BLOK LISTA map ( WYRAZENIE, LISTA ) Oblicza wartość w bloku lub wyrażeniu dla każdego elementu tablicy (iterowanych za pomocą $ ) Zwraca listę elementów powstałych przez takie obliczenie W kontekście skalarnym zwraca liczbę elementów tak wygenerowanych Blok lub wyrażenie są obliczane w kontekście skalarnym, mogą więc zwrócić zero, jeden lub kilka elementów Marcin Junczys-Dowmunt Programowanie w Perlu 1/19 Marcin Junczys-Dowmunt Programowanie w Perlu 16/19

Przykład generowanie listy odmiany przymiotników Przykład usuwanie powtarzających się elementów 1 sub generuj { my $adj = shift ; return map { " $adj$_ ", "${ adj er$_ ", "${ adj st$_ " qw( er e es en em Funkcja map tworzy dla każdej końcówki fleksyjnej trzyelementową listę (rdzenia przymiotnika w stopniu równym, wyższym, najwyższym) Wynikiem jest lista 1-elementowa (3 ) pamiętamy, że dwie listy w kontekście listowym łączą się w jedną większą listę Lista jest zwracana za pomocą return, nie ma potrzeby tworzenia tablicy tymczasowej 1 my @ tablica = qw( aa ab bb aa bb ac ab aa my % hasz = map { $_ = > 1 @ tablica ; @ pojedyncze = sort keys % hasz ; print join (" ", @pojedyncze )."\n"; Funkcja map tworzy listę, w której nieparzyste elementy pochodzą z @tablica, parzyste elementy to 1 Przypisanie tej listy do hasza zamienia nieparzyste elementy na klucze, parzyste na wartości hasza W haszu klucze nie mogą się powtarzać (wartości skojarzone z istniejącym kluczem zostaną nadpisane przez nową wartość) Tablica składająca się z samych kluczy tego hasza jest tablicą zawierająca tylko niepowtarzające 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 zadań programistycznych można rozwiązać 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) Między innymi dzięki tym funkcjom składnia Perla jest taka zwięzła Zadania wykonywane przez te funkcje zajęłyby kilka wierszy każdym tradycyjnym języku programowania Marcin Junczys-Dowmunt Programowanie w Perlu 19/19