• Nie Znaleziono Wyników

Narzędzia informatyczne w językoznawstwie Perl - Manipulowanie tablic, zmienne lokalne, funkcje Marcin Junczys-Dowmunt

N/A
N/A
Protected

Academic year: 2021

Share "Narzędzia informatyczne w językoznawstwie Perl - Manipulowanie tablic, zmienne lokalne, funkcje Marcin Junczys-Dowmunt"

Copied!
49
0
0

Pełen tekst

(1)

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

(2)

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

(3)

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

(4)

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

(5)

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

(6)

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

(7)

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ę

(8)

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ę

(9)

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

(10)

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

(11)

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

(12)

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

(13)

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

(14)

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

(15)

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 ę

(16)

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 ę

(17)

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 ";

(18)

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ą !

(19)

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ą !

(20)

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ą !

(21)

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ą !

(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ą !

(23)

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ą !

(24)

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ą

(25)

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ą

(26)

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ą

(27)

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

(28)

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

(29)

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

(30)

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

(31)

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

(32)

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ę”?

(33)

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ę”?

(34)

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 }

(35)

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

(36)

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

(37)

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

(38)

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

(39)

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

(40)

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

(41)

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 }

(42)

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.

(43)

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.

(44)

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.

(45)

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.

(46)

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 ! ";

}

(47)

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 ] ! ";

(48)

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 ";

(49)

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 ;

Cytaty

Powiązane dokumenty

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

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

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