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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 @
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 @
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 @
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 @
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 @
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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ą!)
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ą!)
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ą!)
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ą!)
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?
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?
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?
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?
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
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
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 ";
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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