• Nie Znaleziono Wyników

Narzędzia informatyczne w językoznawstwie Perl - Tablice asocjacyjne oraz funkcje tablicowe Marcin Junczys-Dowmunt

N/A
N/A
Protected

Academic year: 2021

Share "Narzędzia informatyczne w językoznawstwie Perl - Tablice asocjacyjne oraz funkcje tablicowe Marcin Junczys-Dowmunt"

Copied!
5
0
0

Pełen tekst

(1)

Narzędzia informatyczne w językoznawstwie

Perl - Tablice asocjacyjne oraz funkcje tablicowe

Marcin Junczys-Dowmunt junczys@amu.edu.pl

Zakład Logiki Stosowanej http://www.logic.amu.edu.pl

19. grudnia 2007

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 1/19

Dzisiejszy wykład

I Skupimy się na jednym z najpotężniejszych narzędzi w Perlu – na tzw. haszach:

I omówimy istotę haszów

I sposoby inicjalizacji haszów

I sposoby dodawania i usuwanie elementów

I sposoby przeglądania haszów

I Omówimy powiązania między haszami i tablicami

I w tym sortowanie elementów tablic i haszów za pomocą sort

I tworzenie np. haszów z tablic za pomocą map

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 2/19

Co to jest hasz?

I Hasz jest strukturą podobną do tablicy, ale zamiast indeksów liczbowych hasz używa kluczy

I Bardziej skomplikowana nazwa dla haszy to tablice asocjacyjne, ponieważ kojarzą ze sobą klucze i wartości

I Kluczem hasza może być dowolna wartość skalarna, czyli liczba, łańcuch znakowy (lub referencja)

I Przedrostkiem dla hasza jest znak %, który ma przypominać parę elementów skojarzonych

I Zamiast nawiasów [] korzystamy z {} przy odwoływaniu się do wartości haszów

I Hasze są jedną z najpotężniejszych i najczęściej używanych cech Perla

I Ponoć by programować w Perlu, trzeba myśleć w haszach

Inicjalizacja haszów

1 my % d z w i e k i = ( lew = > " g r r r ", p i e s = > " hau ", kot = > " m i a u ",

5 " t y g r y s b e n g a l s k i " = > " r o a r "

);

p r i n t " Lew r o b i ". $ d z w i e k i {" lew "} ." \ n ";

p r i n t " P i e s r o b i ". $ d z w i e k i { p i e s } ." \ n ";

10 p r i n t " Kot r o b i $ d z w i e k i { kot }\ n ";

p r i n t " T y g r y s r o b i $ d z w i e k i { ’ t y g r y s b e n g a l s k i ’}\ n ";

I Kanoniczny sposób inicjalizacji haszów

I Kojarzymy ze sobą nazwy zwierząt oraz wydawane dźwięki

I Gdy klucz składa się z samych znaków alfanumerycznych, możemy opuścić cudzysłów

(2)

Dodawanie elementów do haszów

1 my % o c z y ;

$ o c z y { kot } = " 2 ";

@ o c z y { mrowka , w a s z k a } = (4 , " m i l i o n ");

5

my @ s t w o r y = qw( p a n t o f e l e k , c z l o w i e k , pajak , m u c h a );

@ o c z y { @ s t w o r y } = (0 , 2 , 8 , " d u z o za d u z o ");

I Możemy dodawać dowolną liczbą elementów do hasza

I Ponieważ nie ma określonej kolejności elementów w haszu, nie potrzebujemy funkcji typu unshift, push

I Podobnie jak dla tablic istnieją wycinki haszów

I Każdy wycinek z hasza jest tablicą(!), stąd przedrostek @

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 5/19

Usuwanie elementów z hasza

1 my % h a s z = ( k l u c z 1 = > 1 , k l u c z 2 = > 2 , k l u c z 3 = > 3);

# my % h a s z = (" k l u c z " , 1 , " k l u c z 2 " , 2 , " k l u c z 3 " , 3);

my $ s k a l a r 1 = d e l e t e $ h a s z { k l u c z 1 };

5 # $ s k a l a r 1 r ó w n y 1

my $ s k a l a r 2 = d e l e t e @ h a s h {qw( k l u c z 1 k l u c z 2 )};

# s k a l a r 2 r ó w n y 2

10 @ t a b l i c a = d e l e t e @ h a s h {qw( k l u c z 1 k l u c z 2 k l u c z 3 )};

# @ t a b l i c a r ó w n a ( undef , undef , 3)

I Funkcja wbudowana delete usuwa podane elementy z hasza

I W kontekście skalarnym zwraca ostatni usunięty element lub undef jeśli element nie istnieje

I 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 Narzędzia informatyczne w językoznawstwie 6/19

Sprawdzanie czy element istnieje w haszu

1 my % m i t y = ( y e t i = > 0 , g w i a z d o r = > " ", w i l k o l a k = > u n d e f

5 );

c h o m p(my $ t e s t = < STDIN >);

if(e x i s t s( $ m i t y { $ t e s t })) {

p r i n t " $ t e s t i s t n i e j e , w a r t o ś ć ’ $ m i t y { $ t e s t } ’\ n ";

10 } e l s e {

p r i n t " $ t e s t nie i s t n i e j e \ n ";

}

I Funkcja exists sprawdza, czy dany element istnieje w haszu

I Istnienie takiej funkcji jest konieczne, ponieważ wartość skojarzona z danym kluczem może być logicznym fałszem

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 7/19

Przeglądanie haszów - według kluczy

1 my % s ł o w n i k = (

s z a f a = > " r z e c z o w n i k ", w i e l k i = > " p r z y m i o t n i k ", m r u g a c = > " c z a s o w n i k ", k r o t k o = > " p r z y s l o w e k ", );

5

f o r e a c h (k e y s % s ł o w n i k ) {

p r i n t " W y r a z $_ to $ s ł o w n i k { $_ }\ n "; }

I Funkcja wbudowana keys zwraca listę wszystkich kluczy danego hasza

I Można tę listę zapisać do zmiennej tablicowej lub użyć w dowolnym kontekście listowym

I Elementy w haszach nie są uporządkowane, więc lista zwrócona przez keys też nie jest

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 8/19

(3)

Przeglądanie haszów - według wartości

1 my % s ł o w n i k = (

s z a f a = > " r z e c z o w n i k ", w i e l k i = > " p r z y m i o t n i k ", m r u g a c = > " c z a s o w n i k ", k r o t k o = > " p r z y s l o w e k ", );

5

f o r e a c h (v a l u e s % s ł o w n i k ) {

p r i n t " S l o w n i k z a w i e r a n a s t . c z e s c i m o w y : \ n ";

}

I Funkcja wbudowana values zwraca listę wszystkich wartości danego hasza (odpowiednik keys)

I W przeciwieństwie do kluczy, wartości w haszu mogą się powtarzać (hasze są lewostronnie jednoznaczne)

I Nie ma bezpośredniej możliwości wyświetlenia klucza do odpowiedniej wartości

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 9/19

Przeglądanie haszów - według par kluczy i wartości

1 my % s ł o w n i k = (

s z a f a = > " r z e c z o w n i k ", w i e l k i = > " p r z y m i o t n i k ", m r u g a c = > " c z a s o w n i k ", k r o t k o = > " p r z y s l o w e k ", );

5

w h i l e(my ( $wyraz , $ c z e s c _ m o w y ) = e a c h % s ł o w n i k ) { p r i n t " W y r a z $ w y r a z to $ c z e s c _ m o w y \ n ";

}

I Funkcja each w kontekście listowym dla podanego hasza zwraca parę klucz-wartość (czyli listę dwuelementową)

I Przy każdym wywołaniu each zwraca kolejną parę, aż zabraknie par w haszu

I W kontekście skalarnym zwraca jedynie kolejne klucze

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 10/19

Hasze - podsumowanie

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

I Hasze można traktować jak zbiory par klucz-wartość (zbiór par uporządkowanych, relacja)

I Elementy haszów nie są uporządkowane (tak jak zbiór)

I Klucze haszy nie mogą się powtarzać, próba dodania pary klucz-wartość dla istniejące klucza spowodują nadpisanie poprzedniej wartości (relacja lewostronnie jednoznaczna)

I Operator => jest synonimem przecinka , (operator listowy), dodatkowo wymusza po lewej stronie kontekst łańcuchowy (nawet gdy klucz jest liczbą!)

Sortowanie tablic

Jeśli chcemy uporządkować tablicę według jakiegoś określonego porządku korzystamy z funkcji sort

1 @ l i s t a _ o b e c n o s c i = qw( Z e n o n W l a d e k A n t e k M i r e k E d e k );

p r i n t j o i n(" \ n ",s o r t @ l i s t a _ o b e c n o s c i )." \ n ";

Sortowanie działa też na liczbach

1 @ l i c z b y = (4 ,7 ,13 ,9 ,5 ,2 ,10 ,7);

p r i n t j o i n(" , ",s o r t @ l i c z b y )." \ n ";

Ale może działać dziwnie dla wartości mieszanych

1 @ m i e s z a n e = (4 ," A n t e k ",13 ,9 ," Z e n o n ",2 ,10 ," M i r e k ");

p r i n t j o i n(" , ", s o r t @ m i e s z a n e )." \ n ";

Według jakiego porządku została posortowana ostatnia lista?

(4)

Sortowanie tablic - ciąg dalszy

Funkcja sort może działać według dowolnych porządków

1 @ m i e s z a n e = (4 ," A n t e k ",13 ,9 ," Z e n o n ",2 ,10 ," M i r e k ");

p r i n t j o i n(" , ", s o r t {

$a <= > $b or $a cmp $b } @ m i e s z a n e )." \ 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

I Zmienne $a i $b reprezentują dwie porównywane wartości sortowanej listy

I Określając sposoby porównywania, określamy porządki sortowania

I Sortowanie, gdzie liczby poprzedzają łańcuchy jest trudniejsze

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 13/19

Inne sortowania

1 @ l i s t a = qw( W a l d e k Z e n e k t o r t T o m e k O l g a Ala w o r e k );

p r i n t j o i n(" , ",s o r t @ l i s t a )." \ n ";

p r i n t j o i n(" , ",s o r t {lc( $a ) cmp lc( $b )} @ l i s t a )." \ n ";

5 p r i n t j o i n(" , ",s o r t {lc( $b ) cmp lc( $a )} @ l i s t a )." \ n ";

@ r e v l i s t a = r e v e r s e s o r t {lc( $a ) cmp lc( $b )} @ l i s t a ; p r i n t j o i n(" , ", @ r e v l i s t a )." \ n ";

10 p r i n t j o i n(" , ", s o r t {

l e n g t h( $a ) <= > l e n g t h( $b ) or $a cmp $b } @ l i s t a )." \ n ";

p r i n t j o i n(" , ", s o r t {

15 r e v e r s e( $a ) cmp r e v e r s e( $b ) } @ l i s t a )." \ n ";

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 14/19

Sortowanie a hasze

1 my % h a s z = (

bb = > " zz ", aa = > " yy ", 11 = > " xx ", );

5 p r i n t " $_ = > $ h a s z { $_ }\ n "

f o r e a c h (s o r t m y s o r t k e y s % h a s z );

sub m y s o r t {

r e t u r n $a <= > $b or $a cmp $b ;

10 }

I Hasze nie mają określonego porządku

I Za pomocą funkcji sort oraz np. keys możemy sobie sami określić taki porządek

I Kryteria sortowania można określić we własnej funkcji, zmienne $a i $b są standardowo dostępne

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 15/19

Funkcja map - Funkcyjne przetwarzanie tablic

1 map { B L O K } L I S T A map( W Y R A Ż E N I E , L I S T A )

I Oblicza wartość w bloku lub wyrażeniu dla każdego elementu tablicy (iterowanych za pomocą $ )

I Zwraca listę elementów powstałych przez takie obliczenie

I W kontekście skalarnym zwraca liczbę elementów tak wygenerowanych

I Blok lub wyrażenie są obliczane w kontekście skalarnym, mogą więc zwrócić zero, jeden lub kilka elementów

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 16/19

(5)

Przykład – generowanie listy odmiany przymiotników

1 sub g e n e r u j { my $ a d j = s h i f t; r e t u r n map {

" $ a d j $ _ ", " $ { adj } e r $ _ ", " $ { adj } s t $ _ "

5 } qw( er e es en em );

}

I Funkcja map tworzy dla każdej końcówki fleksyjnej

trzyelementową listę (rdzenia przymiotnika w stopniu równym, wyższym, najwyższym)

I Wynikiem jest lista 15-elementowa (3 × 5) – pamiętamy, że dwie listy w kontekście listowym łączą się w jedną większą listę

I Lista jest zwracana za pomocą return, nie ma potrzeby tworzenia tablicy tymczasowej

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 17/19

Przykład – usuwanie powtarzających się elementów

1 my @ t a b l i c a = qw( aa ab bb aa bb ac ab aa );

my % h a s z = map { $_ = > 1 } @ t a b l i c a ;

@ p o j e d y n c z e = s o r t k e y s % ha s z ;

5

p r i n t j o i n(" ", @ p o j e d y n c z e )." \ n ";

I Funkcja map tworzy listę, w której nieparzyste elementy pochodzą z @tablica, parzyste elementy to 1

I Przypisanie tej listy do hasza zamienia nieparzyste elementy na klucze, parzyste na wartości hasza

I W haszu klucze nie mogą się powtarzać (wartości skojarzone z istniejącym kluczem zostaną nadpisane przez nową wartość)

I Tablica składająca się z samych kluczy tego hasza jest tablicą zawierająca tylko niepowtarzające się elementy z @tablica

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 18/19

Podsumowanie

I Hasze to jeden z najważniejszych mechanizmów w Perlu

I Bardzo wiele zadań programistycznych można rozwiązać w elegancki sposób za pomocą haszy (zadania domowe)

I Poznaliśmy kilka funkcyjnych sposobów przetwarzania list i haszów (wejściem do funkcji jest lista, wyjściem lista przetworzona)

I Między innymi dzięki tym funkcjom składnia Perla jest taka zwięzła

I Zadania wykonywane przez te funkcje zajęłyby kilka wierszy każdym tradycyjnym języku programowania

Cytaty

Powiązane dokumenty

◮ Hasz jest strukturą podobną do tablicy, ale zamiast indeksów liczbowych hasz używa kluczy.?. Co to

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 18/24.. póki tablica @pokoj zawiera więcej niż

I Parser strumieniowy udostępnia dane zanim sprawdzi poprawność składniową dokumentu. I Wymagania pamięciowe takich parserów są niskie i możemy przetwarzać wielkie dokumenty

I Cała struktura danych jest przechowywana w pamięci, w przypadku dużych dokumentów XML może to stanowić poważny problem.. Struktura danych może zajmować do 30 razy tyle pamięci

I Wszystkie dane wyjściowe konwertujemy po zakończeniu przetwarzania z kodowania wewnętrznego Perla do kodowania

Najpierw wykonamy nasz program z poziomu wiersza poleceń komendą (o ile znajdujemy się w tym samym katalogu) perl hello.pl. Marcin Junczys-Dowmunt Narzędzia informatyczne

Każde narzędzie informatyczne działające na danych lingwistycznych musi brać pod uwagę następujące aspekty:. ◮ Wielojęzyczność

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 2/16!. Wyświetlanie