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