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

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

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. Programowanie w Perlu. Usuwanie elementów z początku tablicy. Dodawanie elementów do początku tablic

Dzisiejszy wykład. Narzędzia informatyczne w językoznawstwie. 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 ;

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

Lekcja 7 Tablice. Definiowanie tablicy

Programowanie obiektowe

PHP: bloki kodu, tablice, obiekty i formularze

Pożyteczne linki: PERL Practical Extraction and Report Language

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

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

PERL Practical Extraction and Report Language

PERL. Practical Extraction and Report Language Pathologically Eclectic Rubbish Lister

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

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

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

Języki formalne i automaty Ćwiczenia 6

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

Wprowadzenie do baz danych

JS:Obiekty, tablice, JSON

Narzędzia informatyczne w językoznawstwie

1 Podstawy c++ w pigułce.

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

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

Sortowanie topologiczne skierowanych grafów acyklicznych

1 Podstawy c++ w pigułce.

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Listy, krotki, słowniki, funkcje

Paradygmaty programowania

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

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

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

Oracle11g: Wprowadzenie do SQL

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

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

Pętle. for, while, do... while, foreach. Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.

Programowanie w Ruby

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

Podstawy Informatyki i algorytmizacji

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

Relacyjne bazy danych. Podstawy SQL

Programowanie w języku Python. Grażyna Koba

Programowanie w Ruby

Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop Spis treści

TOPIT Załącznik nr 3 Programowanie aplikacji internetowych

Laboratorium nr 8. Temat: Podstawy języka zapytań SQL (część 2)

media Blitz wydajne sytemy szablonów

Tworzenie aplikacji w języku Java

Programowanie dla początkujących w 24 godziny / Greg Perry, Dean Miller. Gliwice, cop Spis treści

Generacja kodu docelowego

Wyrażenia regularne. Wyrażenia regularne 1/41

Podstawy bioinformatyki 2017/18

Podstawy bioinformatyki 2017/18

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

Java Collections Framework

Bash - wprowadzenie. Bash - wprowadzenie 1/39

Programowanie robota mobilnego E-puck w języku Python

Microsoft SQL Server Podstawy T-SQL

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

Struktury danych (I): kolejka, stos itp.

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

Michał Bielecki, KNI 'BIOS'

1 TEMAT LEKCJI: 2 CELE LEKCJI: 3 METODY NAUCZANIA 4 ŚRODKI DYDAKTYCZNE 5 UWARUNKOWANIA TECHNICZNE. Scenariusz lekcji. 2.

Podstawy Informatyki i algorytmizacji

Podstawowe części projektu w Javie

SQL SERVER 2012 i nie tylko:

Lista, Stos, Kolejka, Tablica Asocjacyjna

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA

Laboratorium Bazy danych SQL 2

Programowanie komputerowe. Zajęcia 4

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

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

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

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Relacyjne bazy danych. Podstawy SQL

PHP i MySQL dla każdego / Marcin Lis. Wyd. 3. Gliwice, cop Spis treści

Bazy danych - wykład wstępny

Wykład IV PASCAL - łańcuch znaków, - procedury i funkcje, - sortowanie bąbelkowe

Algorytmy sortujące i wyszukujące

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

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

Ćwiczenie zapytań języka bazy danych PostgreSQL

Podstawy języka T-SQL : Microsoft SQL Server 2016 i Azure SQL Database / Itzik Ben-Gan. Warszawa, Spis treści

Podstawowe funkcje dodatku linq w C#

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

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

PERL HISTORIA. Możliwości związane z CGI, uniwersalność oraz fakt, że Perl jest językiem darmowym stało się przyczyną jego dynamicznego rozwoju.

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Tabela wewnętrzna - definicja

Warunki logiczne instrukcja if

Transkrypt:

Programowanie 2 Perl - Tablice asocjacyjne oraz funkcje tablicowe Marcin Junczys-Dowmunt junczys@amu.edu.pl Zakład Logiki Stosowanej http://www.logic.amu.edu.pl 8. grudnia 2009 Marcin Junczys-Dowmunt Programowanie 2 1/16

Dzisiejszy wykład 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 2 2/16

Co to jest hasz? 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 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 Ponoć by programować w Perlu, trzeba myśleć w haszach Marcin Junczys-Dowmunt Programowanie 2 3/16

Inicjalizacja haszów 1 my % dzwieki = ( lew => " grrr ", pies => " hau ", kot => " miau ", 5 " 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 2 4/16

Dodawanie elementów do haszów 1 my % oczy ; $oczy { kot } = "2"; 5 @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 2 5/16

Przeglądanie haszów - według kluczy 1 my % słownik = ( szafa = > " rzeczownik ", wielki = > " przymiotnik ", mrugac = > " czasownik ", krotko = > " przyslowek ", ); 5 foreach my $slowo_ klucz ( keys % słownik ) { print " Wyraz $slowo_ klucz to "." $słownik { $slowo_klucz }\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 2 6/16

Przeglądanie haszów - według wartości 1 my % słownik = ( szafa = > " rzeczownik ", wielki = > " przymiotnik ", mrugac = > " czasownik ", krotko = > " przyslowek ", ); 5 foreach my $czesc_ mowy_ wartosc ( values % słownik ) { print " Slownik zawiera nast. czesci mowy :"." $czesc_mowy_wartosc \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 Marcin Junczys-Dowmunt Programowanie 2 7/16

Przeglądanie haszów - według par kluczy i wartości 1 my % słownik = ( szafa = > " rzeczownik ", wielki = > " przymiotnik ", mrugac = > " czasownik ", krotko = > " przyslowek ", ); 5 while ( my ( $wyraz, $czesc_ mowy ) = each % słownik ) { 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 2 8/16

Usuwanie elementów z hasza 1 my % hasz = ( klucz1 => 1, klucz2 => 2, klucz3 => 3); # my % hasz = (" klucz ", 1, " klucz2 ", 2, " klucz3 ", 3); my $skalar1 = delete $hasz { klucz1 }; 5 # $skalar1 równy 1 my $skalar2 = delete @ hash { qw( klucz1 klucz2 )}; # skalar2 równy 2 10 @ tablica = delete @ hash { qw( klucz1 klucz2 klucz3 )}; # @ tablica równa ( 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 2 9/16

Sprawdzanie czy element istnieje w haszu 1 my % mity = ( yeti => 0, gwiazdor => "", wilkolak = > undef 5 ); chomp ( my $test = < STDIN >); if( exists ( $mity { $test })) { print " $test istnieje, wartość $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 Marcin Junczys-Dowmunt Programowanie 2 10/16

Hasze - podsumowanie 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ą!) Marcin Junczys-Dowmunt Programowanie 2 11/16

Sortowanie tablic 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,5,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 2 12/16

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 Marcin Junczys-Dowmunt Programowanie 2 13/16

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"; 5 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 { 15 reverse ($a) cmp reverse ($b) } @lista )."\n"; Marcin Junczys-Dowmunt Programowanie 2 14/16

Sortowanie a hasze 1 my % hasz = ( " Ala " => " imie ", " pies " => " zwierze ", " Londyn " => " miasto ", " arbuz " => " owoc ", ); 5 foreach $klucz ( sort {lc($a) cmp lc($b) } keys % hasz ){ print " $klucz => $hasz { $klucz }\n" } foreach $klucz ( 10 sort { $hasz {$a} cmp $hasz {$b }} keys % hasz ){ print " $klucz => $hasz { $klucz }\n" } Za pomocą funkcji sort oraz np. keys możemy sobie sami określić porządek w haszu W bloku określającym porządek można również korzystać z przetwarzanej tablicy haszującej (np. pobierając wartość dla danego klucza) Marcin Junczys-Dowmunt Programowanie 2 15/16

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 2 16/16