Perl - Zakład Logiki Stosowanej
Transkrypt
Perl - Zakład Logiki Stosowanej
Dzisiejszy wykład Narzędzia informatyczne w językoznawstwie Perl - Manipulowanie tablic, zmienne lokalne, funkcje ◮ Wrócimy do tablic i omówimy: ◮ Marcin Junczys-Dowmunt [email protected] ◮ ◮ Omówimy zmienne lokalne oraz zakresy ważności zmiennych Wprowadzimy pojęcie funkcji i omówimy: ◮ Zakład Logiki Stosowanej http://www.logic.amu.edu.pl wydajne dodawanie i usuwanie elementów z tablic ◮ ◮ wykonywanie funkcji zwracanie argumentów przez funkcje przekazywanie argumentów do funkcji 24. grudnia 2008 Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 1/1 Usuwanie elementów z początku tablicy Marcin Junczys-Dowmunt 5 @ k o l e j k a = qw ( M a r y s i a Janek Hania Kuba ) while ( @ k o l e j k a) { print " Osoby w k o l e j c e: " . join ( @ k o l e j k a ). " \ n " ; print " K a s j e r k a o b s ł u g u j e: " . shift ( @ k o l e j k a ). " \ n " ; } ◮ Funkcja shift usuwa pierwszy element tablicy i zwraca go ◮ Indeksy ”przesuwają” się, stąd nazwa shift Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 2/1 Dodawanie elementów do początku tablic 1 1 Narzędzia informatyczne w językoznawstwie 5 @ k o l e j k a = qw ( M a r y s i a Janek Hania Kuba ) while ( @ k o l e j k a) { print " Osoby w k o l e j c e: " . join ( @ k o l e j k a ). " \ n " ; $ a k t u a l n a = shift ( @ k o l e j k a ); print " K a s j e r k a o b s ł u g u j e: $ a k t u a l n a\ n " ; if ( rand () < 0.5) { print " Zly bilet , $ a k t u a l n a wraca do okna \ n " ; u n s h i f t( @kolejka , $ a k t u a l n a ); } 10 } 3/1 ◮ Funkcja unshift wstawia element na początek tablicy ◮ Wstawia kilka elementów, gdy drugim elementem jest lista ◮ ”Przesunięcie” indeksów następuje w drugą stronę Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 4/1 Dodawanie elementów do końca tablicy 1 5 Usuwanie elementów z końca tablica @ k o l e j k a = qw ( M a r y s i a Janek Hania Kuba ) while ( @ k o l e j k a) { print " Osoby w k o l e j c e: " . join ( @ k o l e j k a ). " \ n " ; $ a k t u a l n a = shift ( @ k o l e j k a ); print " K a s j e r k a o b s ł u g u j e: $ a k t u a l n a\ n " ; 1 5 if ( rand () < 0.5) { print " Zly bilet , $ a k t u a l n a wraca na koniec \ n " ; push ( @kolejka , $ a k t u a l n a ); } 10 @ k o l e j k a = qw ( M a r y s i a Janek Hania Kuba ) while ( @ k o l e j k a) { print " Osoby w k o l e j c e: " . join ( @ k o l e j k a ). " \ n " ; $ a k t u a l n a = shift ( @ k o l e j k a ); print " K a s j e r k a o b s ł u g u j e: $ a k t u a l n a\ n " ; if ( rand () < 0.5) { print " Zly bilet , $ a k t u a l n a wraca na koniec \ n " ; push ( @kolejka , $ a k t u a l n a ); } if ( rand () < 0.5) { print pop ( @ k o l e j k a ). " ma dosyć c z e k a n i a\ n " ; } 10 } ◮ Funkcja push wstawia element na koniec tablicy ◮ Wstawia kilka elementów, gdy drugim elementem jest lista ◮ Dodawanie elementów na końcu nie ”przesuwa” indeksów Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie } ◮ 5/1 Wstawianie i usuwanie dowolnych elementów tablicy I Marcin Junczys-Dowmunt splice splice splice splice TABLICA , PRZESUNIĘCIE , DŁUGOŚĆ , LISTA TABLICA , PRZESUNIĘCIE , D Ł U G O Ś Ć TABLICA , P R Z E S U N I Ę C I E TABLICA 1 5 ◮ Funkcja splice jest bardziej uniwersalna od poprzednich ◮ Potrafi usuwać i dodawać elementy w dowolnym miejscu ◮ Zwraca wszystkie usunięte elementy w kontekście listowym ◮ Zwraca ostatni usunięty element w kontekście skalarnym ◮ Liczba indeksów jest odpowiednio zmniejszana lub zwiększana Narzędzia informatyczne w językoznawstwie 6/1 1 7/1 splice może zastąpić każdą z poprzednich funkcji push ( @a , $x , $y ) pop ( @a ) shift ( @a ) u n s h i f t( @a , $x , $y ) $a [ $i ] = $y ◮ 5 Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie Wstawianie i usuwanie dowolnych elementów tablicy II ◮ 1 Funkcję pop poznaliśmy już wcześniej splice ( @a , @a ,0 , $x , $y ) splice ( @a , -1) splice ( @a ,0 ,1) splice ( @a ,0 ,0 , $x , $y ) splice ( @a , $i ,1 , $y ) i nie tylko splice ( @a ,3 ,3) # usuń 3 e l e m e n t y od 3 splice ( @a ,3 ,3 , $x , $y ) # zastąp 3 e l e m e n t y od 3 # e l e m e n t a m i $x i $y splice ( @a ,3) # usuń w s z y s t k i e e l e m e n t y od 3 splice ( @a ) # usuń w s z y s t k i e e l e m e n t y splice ( @a ,3 ,0 , $x ) # wstaw $x na 3 , p r z e s u ń resztę Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 8/1 Kontekst listowy a zmienne skalarne Zmienne lokalne i zmienne globalne I Jakie będą odpowiednio wartości zmiennych $test, $test2 oraz @tablica2 w poniższych przykładach i dlaczego? 1 ◮ Jak dotąd korzystaliśmy tylko ze zmiennych globalnych ◮ Ogólnie uznaję sie to za zły styl programowania – Dlaczego? @ t a b l i c a = qw ( aa ab ba bb ); Czym rózni się zmienna lokalna od globalnej? $test = @ t a b l i c a; print " Test 1: $test \ n " ; ◮ Zmienna globalna jest dostępna w każdym miejscu naszego programu ◮ Zmienna lokalna jest dostępna tylko wewnątrz bloku, w którym została stworzona ◮ Zmienna globalna przestaje istnieć, gdy zakończy się program ◮ Zmienne lokalna przestaje istnieć, gdy opuszczamy blok, w którym zostałą stworzona ◮ Uwaga: Zmienna $ jest zmienną globalną ! 5 ( $test ) = @ t a b l i c a; print " Test 2: $test \ n " ; 10 ( $test , $test2 ) = @ t a b l i c a; print " Test 3: $test , $test2 \ n " ; ( @tablica2 , $test ) = @ t a b l i c a; print " Test 4: $test \ n " ; Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 9/1 Zmienne lokalne i zmienne globalne II Marcin Junczys-Dowmunt $ g l o b a l n a = 4; print " G l o b a l n a: $ g l o b a l n a\ n " ; { 5 my $ l o k a l n a = 5; print " L o k a l n a: $ l o k a l n a\ n " ; 5 } 10 print " G l o b a l n a: $ g l o b a l n a\ n " ; print " L o k a l n a: $ l o k a l n a\ n " ; ◮ ◮ 10 my $x = 4; print " Blok 1: x { my $x = 5; my $y = 3; print " Blok 2: { my $x ; print " Blok } } print " Blok 1: x = $x \ n " ; x = $x , y = $y \ n " ; 3: x = $x , y = $y \ n " ; = $x , y = $y \ n " ; Zmienna lokalna jest tworzona wewnątrz bloku za pomocą słowa kluczowego my ◮ Bez słowa kluczowego my stworzylibyśmy kolejną zmienną globalną Zmienna lokalna stworzona poza jakimkolwiek blokiem jest zmienną globalną ◮ my tworzy zupełnie nową zmienną, która przykrywa inne zmienne (z otaczających bloków) o tej samej nazwie Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 10/1 Zmienne lokalne i zmienne globalne III 1 1 Narzędzia informatyczne w językoznawstwie 11/1 Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 12/1 Funkcje w Perlu Funkcje - przykład programu bez funkcji 1 ◮ Nasze programy zaczynają się rozrastać ◮ Byłoby lepiej, gdybyśmy znali sposób na uporządkowanie naszego kodu ◮ Takim sposobem są funkcje ◮ Funkcje to małe podprogramy, z których możemy korzystać wiele razy w naszym programie Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 5 5 10 sub p o b i e r z _ i m i e { print " Podaj imie : " ; my $name = < STDIN >; chomp ( $name ); return $name ; } Narzędzia informatyczne w językoznawstwie Podobny program widzieliśmy na ostatnim wykładzie ◮ Co się stanie, gdy podamy ”pustę” imię? ◮ Dlaczego pojawia się dwa razy ciąg ”Podaj imię”? Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 14/1 Struktura funkcji while ( my $name = p o b i e r z _ i m i e ()) { print " Witaj , $name !\ n " ; } Marcin Junczys-Dowmunt ◮ 13/1 Funkcje - pierwszy przykład z funkcjami 1 print " Podaj imie : " ; while ( my $name = < STDIN >) { chomp ( $name ); exit if ( $name eq ’ ’ ); print " Witaj , $name !\ n " ; print " Podaj imie : " ; } 15/1 ◮ Funkcje to bloki programu, które są zapisywane poza właściwym programem (za lub przed) ◮ Wykonują się one dopiero, gdy jawnie użyjemy nazwy funkcji we właściwym programie ◮ Słowo kluczowe sub poprzedza nazwę funkcji, którą ustalamy sami; nazwy powinny kojarzyć się działaniem tworzonej funkcji ◮ Polecenie return wewnętrz funkcji, natychmiast kończy działanie funkcji ◮ Jeśli przy return zostało podane jakieś wyrażenie, to zostanie one przez funkcję zwrócone ◮ Możemy zwracać wartości skalarne i tablicowe Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 16/1 Przykład - przekazywanie argumentów do funkcji 1 while ( my $name = p o b i e r z _ i m i e ()) { witaj ( $name ); } 10 sub p o b i e r z _ i m i e { print " Podaj imie : " ; my $name = < STDIN >; chomp ( $name ); return $name ; } 15 sub witaj { my $name = shift ; print " Witaj , $name ! " ; } 5 Przekazywanie argumentów do funkcji Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 17/1 Przykład - wersja wieloargumentowa (kanoniczny) 1 5 ◮ Możemy również przekazywać zmienne i wartości do funkcji ◮ Odbywa się to za pomocą specjalnej tablicy @ ◮ Tablica @ jest tablicową wersją zmiennej domyślnej $ ◮ Wszystkie argumenty funkcji są zapisywane do tablicy @ w takiej kolejności w jakiej zostały podane przy wywołaniu funkcji ◮ Wewnątrz funkcji powinniśmy (ale nie musimy) skopiować wartości z tablicy @ do odpowiednio nazwanych zmiennych lokalnych ◮ Do kopiowania mogą nam służyć dowolne metody poznane dzisiaj w pierwszej części wykładu. Poprzedni i następny sposób uznaje się za kanoniczne. Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 18/1 Przykład - wersja wieloargumentowa (niekanoniczny) while ( my ( $f_name , $ s _ n a m e) = p o b i e r z _ n a z w i s k o ()) { witaj ( $f_name , $ s _ n a m e ); } sub p o b i e r z _ n a z w i s k o { print " Podaj imie : " ; my $ f _ n a m e = < STDIN >; print " Podaj n a z w i s k o: " ; my $ s _ n a m e = < STDIN >; 1 5 10 10 while ( my @names = p o b i e r z _ n a z w i s k o ()) { witaj ( @names ); } sub p o b i e r z _ n a z w i s k o { my @names ; print " Podaj imie : " ; $names [0] = < STDIN >; print " Podaj n a z w i s k o: " ; $names [1] = < STDIN >; chomp ( $f_name , $ s _ n a m e ); return ( $f_name , $ s _ n a m e ); chomp ( @names ); return @names ; } } 15 sub witaj { my ( $f_name , $ s _ n a m e) = @_ ; print " Witaj , $ f _ n a m e $ s _ n a m e! " ; } Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 15 sub witaj { print " Witaj , $_ [0] $_ [1]! " ; } 19/1 Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 20/1 Program zliczający znaki w pliku - bez funkcji Program zliczający znaki w pliku - z funkcjami 1 1 5 10 my $ t o t a l _ c o u n t ; f o r e a c h my $ f i l e n a m e ( @ARGV ) { open ( IN , " < $ f i l e n a m e" ) or die " Plik nie i s t n i e j e" ; my $count ; while ( < IN >) { $count += length ( $_ ); } close ( IN ); print " Plik $ f i l e n a m e z a w i e r a $count znakow \ n " ; $ t o t a l _ c o u n t += $count ; } print " W sumie było $ t o t a l _ c o u n t znakow \ n " ; 5 10 15 Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 21/1 my $ t o t a l _ c o u n t ; f o r e a c h my $ f i l e n a m e ( @ARGV ) { my $count = zlicz ( $ f i l e n a m e ); print " Plik $ f i l e n a m e z a w i e r a $count znakow \ n " ; $ t o t a l _ c o u n t += $count ; } print " W sumie było $ t o t a l _ c o u n t znakow \ n " ; sub zlicz { my $ f i l e n a m e = shift ; open ( IN , " < $ f i l e n a m e" ) or die " Plik nie i s t n i e j e" ; my $count ; while ( < IN >) { $count += length ( $_ ); } close ( IN ); return $count ; } Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 22/1