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