Dzisiejszy wykład
Programowanie w Perlu
Manipulowanie tablicami, zmienne lokalne, funkcje
Wrócimy do tablic i omówimy:
wydajne dodawanie i usuwanie elementów z tablic
Omówimy zmienne lokalne oraz zakresy ważności zmiennych
Marcin Junczys-Dowmunt
junczys@amu.edu.pl Wprowadzimy pojęcie funkcji i omówimy:
wykonywanie funkcji
Wydział Matematyki i Informatyki
zwracanie argumentów przez funkcje
http://web.wmi.amu.edu.pl
przekazywanie argumentów do funkcji
Marcin Junczys-Dowmunt Programowanie w Perlu 1/22 Marcin Junczys-Dowmunt Programowanie w Perlu 2/22
Usuwanie elementów z początku tablicy Dodawanie elementów do początku tablic
1 @kolejka = qw(Marysia Janek Hania Kuba)
while(@kolejka) {
print "Osoby w kolejce: ".join(@kolejka)."\n";
1 @kolejka = qw(Marysia Janek Hania Kuba)
$aktualna = shift(@kolejka);
while(@kolejka) {
5 print "Kasjerka obsluguje: $aktualna\n";
print "Osoby w kolejce: ".join(@kolejka)."\n";
print "Kasjerka obsluguje: ".shift(@kolejka)."\n";
if(rand() < 0.5) {
5 }
print "Zly bilet, $aktualna wraca do okna\n";
unshift(@kolejka, $aktualna);
10 }
Funkcjashiftusuwa pierwszy element tablicy i zwraca go
}
Indeksy przesuwają się, stąd nazwa shift
Funkcjaunshiftwstawia 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 Programowanie w Perlu 3/22 Marcin Junczys-Dowmunt Programowanie w Perlu 4/22
Dodawanie elementów do końca tablicy Usuwanie elementów z końca tablica
1 @kolejka = qw(Marysia Janek Hania Kuba)
1 @kolejka = qw(Marysia Janek Hania Kuba)
while(@kolejka) {
while(@kolejka) {
print "Osoby w kolejce: ".join(@kolejka)."\n";
print "Osoby w kolejce: ".join(@kolejka)."\n";
$aktualna = shift(@kolejka);
$aktualna = shift(@kolejka);
5 print "Kasjerka obsluguje: $aktualna\n";
5 print "Kasjerka obsluguje: $aktualna\n";
if(rand() < 0.5) {
if(rand() < 0.5) {
print "Zly bilet, $aktualna wraca na koniec\n";
print "Zly bilet, $aktualna wraca na koniec\n";
push(@kolejka, $aktualna);
push(@kolejka, $aktualna);
10 }
10 }
if(rand() < 0.5) {
}
print pop(@kolejka)." ma dosyc czekania\n";
}
Funkcjapushwstawia element na koniec tablicy
}
Wstawia kilka elementów, gdy drugim elementem jest lista
Dodawanie elementów na końcu nie przesuwa indeksów
Funkcjępoppoznaliśmy już wcześniej
Marcin Junczys-Dowmunt Programowanie w Perlu 5/22 Marcin Junczys-Dowmunt Programowanie w Perlu 6/22
Wstawianie i usuwanie dowolnych elementów tablicy I Wstawianie i usuwanie dowolnych elementów tablicy II
splicemoże zastąpić każdą z poprzednich funkcji
1 splice TABLICA,PRZESUNIECIE,DLUGOSC,LISTA
1 push(@a,$x,$y) splice(@a,@a,0,$x,$y)
splice TABLICA,PRZESUNIECIE,DLUGOSC
pop(@a) splice(@a,-1)
splice TABLICA,PRZESUNIECIE
shift(@a) splice(@a,0,1)
splice TABLICA
unshift(@a,$x,$y) splice(@a,0,0,$x,$y)
5 $a[$i] = $y splice(@a,$i,1,$y)
Funkcjasplicejest bardziej uniwersalna od poprzednich
i nie tylko
Potrafi usuwać i dodawać elementy w dowolnym miejscu
Zwraca wszystkie usunięte elementy w kontekście listowym
1 splice(@a,3,3) # usun 3 elementy od 3
Zwraca ostatni usunięty element w kontekście skalarnym
splice(@a,3,3,$x,$y) # zastap 3 elementy od 3
# elementami $x i $y
Liczba indeksów jest odpowiednio zmniejszana lub zwiększana
splice(@a,3) # usun wszystkie elementy od 3
5 splice(@a) # usun wszystkie elementy
splice(@a,3,0,$x) # wstaw $x na 3, przesun reszte n
Marcin Junczys-Dowmunt Programowanie w Perlu 7/22 Marcin Junczys-Dowmunt Programowanie w Perlu 8/22
Kontekst listowy a zmienne skalarne Zmienne lokalne i zmienne globalne I
Jakie będą odpowiednio wartości zmiennych $test, $test2 oraz
Jak dotąd korzystaliśmy tylko ze zmiennych globalnych
@tablica2 w poniższych przykładach i dlaczego?
Ogólnie uznaję sie to za zły styl programowania Dlaczego?
1 @tablica = qw(aa ab ba bb);
Czym rózni się zmienna lokalna od globalnej?
$test = @tablica;
print "Test 1: $test\n";
Zmienna globalna jest dostępna w każdym miejscu naszego
5
programu
($test) = @tablica;
Zmienna lokalna jest dostępna tylko wewnątrz bloku, w
print "Test 2: $test\n";
którym została stworzona
($test, $test2) = @tablica;
Zmienna globalna przestaje istnieć, gdy zakończy się program
10 print "Test 3: $test, $test2\n";
Zmienne lokalna przestaje istnieć, gdy opuszczamy blok, w
którym zostałą stworzona
(@tablica2, $test) = @tablica;
print "Test 4: $test\n"; Uwaga: Zmienna$ jest zmienną globalną !
Marcin Junczys-Dowmunt Programowanie w Perlu 9/22 Marcin Junczys-Dowmunt Programowanie w Perlu 10/22
Zmienne lokalne i zmienne globalne II Zmienne lokalne i zmienne globalne III
1 my $x = 4;
1 $globalna = 4;
print "Blok 1: x = $x\n";
print "Globalna: $globalna\n";
{
my $x = 5;
{
5 my $y = 3;
5 my $lokalna = 5;
print "Blok 2: x = $x, y = $y\n";
print "Lokalna: $lokalna\n";
{
}
my $x;
print "Blok 3: x = $x, y = $y\n";
print "Globalna: $globalna\n";
10 }
10 print "Lokalna: $lokalna\n";
}
print "Blok 1: x = $x, y = $y\n";
Zmienna lokalna jest tworzona wewnątrz bloku za pomocą
słowa kluczowegomy
Zmienna lokalna stworzona poza jakimkolwiek blokiem jest
zmienną globalną
Bez słowa kluczowegomystworzylibyśmy kolejną zmienną
globalną
mytworzy zupełnie nową zmienną, która przykrywa inne
zmienne (z otaczających bloków) o tej samej nazwie
Marcin Junczys-Dowmunt Programowanie w Perlu 11/22 Marcin Junczys-Dowmunt Programowanie w Perlu 12/22
Funkcje w Perlu Funkcje - przykład programu bez funkcji
1 print "Podaj imie: ";
while(my $name =
) {
Nasze programy zaczynają się rozrastać
chomp($name);
exit if($name eq );
Byłoby lepiej, gdybyśmy znali sposób na uporządkowanie
5 print "Witaj, $name!\n";
naszego kodu
print "Podaj imie: ";
Takim sposobem są funkcje
}
Funkcje to małe podprogramy, z których możemy korzystać
Podobny program widzieliśmy na ostatnim wykładzie
wiele razy w naszym programie
Co się stanie, gdy podamy pustę imię?
Dlaczego pojawia się dwa razy ciąg Podaj imię ?
Marcin Junczys-Dowmunt Programowanie w Perlu 13/22 Marcin Junczys-Dowmunt Programowanie w Perlu 14/22
Funkcje - pierwszy przykład z funkcjami Struktura funkcji
Funkcje to bloki programu, które są zapisywane poza
właściwym programem (za lub przed)
1 while(my $name = pobierz_imie()) {
print "Witaj, $name!\n";
Wykonują się one dopiero, gdy jawnie użyjemy nazwy funkcji
}
we właściwym programie
Słowo kluczowesubpoprzedza nazwę funkcji, którą ustalamy
5 sub pobierz_imie {
sami; nazwy powinny kojarzyć się działaniem tworzonej funkcji
print "Podaj imie: ";
my $name = ;
Poleceniereturnwewnętrz funkcji, natychmiast kończy
chomp($name);
działanie funkcji
return $name;
Jeśli przyreturnzostało podane jakieś wyrażenie, to zostanie
10 }
one przez funkcję zwrócone
Możemy zwracać wartości skalarne i tablicowe
Marcin Junczys-Dowmunt Programowanie w Perlu 15/22 Marcin Junczys-Dowmunt Programowanie w Perlu 16/22
Przykład - przekazywanie argumentów do funkcji Przekazywanie argumentów do funkcji
1 while(my $name = pobierz_imie()) {
Możemy również przekazywać zmienne i wartości do funkcji
witaj($name);
Odbywa się to za pomocą specjalnej tablicy@
}
Tablica@ jest tablicową wersją zmiennej domyślnej$
5 sub pobierz_imie {
Wszystkie argumenty funkcji są zapisywane do tablicy@ w
print "Podaj imie: ";
takiej kolejności w jakiej zostały podane przy wywołaniu
my $name = ;
funkcji
chomp($name);
return $name; Wewnątrz funkcji powinniśmy (ale nie musimy) skopiować
10 }
wartości z tablicy@ do odpowiednio nazwanych zmiennych
lokalnych
sub witaj {
Do kopiowania mogą nam służyć dowolne metody poznane
my $name = shift;
dzisiaj w pierwszej części wykładu. Poprzedni i następny
print "Witaj, $name!";
15 } sposób uznaje się za kanoniczne.
Marcin Junczys-Dowmunt Programowanie w Perlu 17/22 Marcin Junczys-Dowmunt Programowanie w Perlu 18/22
Przykład - wersja wieloargumentowa (kanoniczny) Przykład - wersja wieloargumentowa (niekanoniczny)
1 while(my ($f_name,$s_name) = pobierz_nazwisko()) { 1 while(my @names = pobierz_nazwisko()) {
witaj($f_name,$s_name); witaj(@names);
} }
5 sub pobierz_nazwisko { 5 sub pobierz_nazwisko {
print "Podaj imie: "; my @names;
my $f_name = ; print "Podaj imie: ";
print "Podaj nazwisko: "; $names[0] = ;
my $s_name = ; print "Podaj nazwisko: ";
10 10 $names[1] = ;
chomp($f_name,$s_name);
return ($f_name,$s_name); chomp(@names);
} return @names;
}
15 sub witaj { 15
my ($f_name,$s_name) = @_; sub witaj {
print "Witaj, $f_name $s_name!"; print "Witaj, $_[0] $_[1]!";
} }
Marcin Junczys-Dowmunt Programowanie w Perlu 19/22 Marcin Junczys-Dowmunt Programowanie w Perlu 20/22
Program zliczający znaki w pliku - bez funkcji Program zliczający znaki w pliku - z funkcjami
1 my $total_count;
foreach my $filename (@ARGV) {
my $count = zlicz($filename);
1 my $total_count;
print "Plik $filename zawiera $count znakow\n";
foreach my $filename (@ARGV) {
5 $total_count += $count;
open(IN, "<$filename") or die "Plik nie istnieje";
}
my $count;
print "W sumie bylo $total_count znakow\n";
5 while() {
$count += length($_);
sub zlicz {
}
10 my $filename = shift;
close(IN);
open(IN, "<$filename") or die "Plik nie istnieje";
print "Plik $filename zawiera $count znakow\n";
my $count;
10 $total_count += $count;
while() {
}
$count += length($_);
print "W sumie bylo $total_count znakow\n";
15 }
close(IN);
return $count;
}
Marcin Junczys-Dowmunt Programowanie w Perlu 21/22 Marcin Junczys-Dowmunt Programowanie w Perlu 22/22
Wyszukiwarka
Podobne podstrony:
Wyklad07 handout
Wyklad3 handout
Wyklad17 handout
Wyklad06 handout
Wyklad5 handout
Wyklad2 handout
Wyklad04 2008 handout
Wyklad xmlparse handout
Wyklad1 2008 handout
20151012 MichalTrzesiok Statystyka wyklad2 miary statystyczne handout
Wyklad03 2008 handout
Wyklad2 2008 handout
Wyklad05 2008 handout
20151019 MichalTrzesiok Statystyka wyklad3 analiza korelacji handout
Sieci komputerowe wyklady dr Furtak
Wykład 05 Opadanie i fluidyzacja
AGH Sed 4 sed transport & deposition EN ver2 HANDOUT
więcej podobnych podstron