7578
Szczegóły |
Tytuł |
7578 |
Rozszerzenie: |
PDF |
Jesteś autorem/wydawcą tego dokumentu/książki i zauważyłeś że ktoś wgrał ją bez Twojej zgody? Nie życzysz sobie, aby podgląd był dostępny w naszym serwisie? Napisz na adres
[email protected] a my odpowiemy na skargę i usuniemy zabroniony dokument w ciągu 24 godzin.
7578 PDF - Pobierz:
Pobierz PDF
Zobacz podgląd pliku o nazwie 7578 PDF poniżej lub pobierz go na swoje urządzenie za darmo bez rejestracji. Możesz również pozostać na naszej stronie i czytać dokument online bez limitów.
7578 - podejrzyj 20 pierwszych stron:
KURS PROGRAMOWANIA W PERL-u
1. Co to jest Perl?
�Perl to z za�o�enia praktyczny, interpretowany j�zyk programowania przeznaczony przede wszystkim do wykonywania r�nych zada� systemowych m.in. przeszukiwania plik�w tekstowych, pobierania z nich informacji i generowania komunikat�w na ich podstawie. �wietnie nadaje si� do pisania skrypt�w CGI. Jego autorem jest Larry Wall wspomagany oczywi�cie przez ogromn� liczb� innych programist�w. Perl jest kompletny, stosunkowo �atwy w u�yciu oraz wydajny, przyp�acaj�c to mo�e nieco elegancj�. Posiada wiele cech j�zyka C, jak r�wnie� sed, awk i sh. Programuj�cy w w/w j�zykach nie powinni mie� wi�kszych problem�w z opanowaniem Perla. Kompilatory Perla s� bezp�atne i dost�pne dla wielu system�w operacyjnych. Wi�kszo�� skrypt�w jest przeno�na. Archiwum CPAN zawiera wiele cennych materia��w dotycz�cych Perla, takich jak kompilatory, skrypty, biblioteki.
2. Zaczynamy.
2.1 Pierwsza linijka.
Pierwsza linijka kodu w j�zyku Perl ma specjalne znaczenie, aczkolwiek nie jest niezb�dna do dzia�ania programu. Powinna wygl�da� nast�puj�co:
�
#!/usr/bin/perl
�cie�ka /usr/bin/perl zale�y od konkretnego systemu i nale�y j� odpowiednio zmodyfikowa�, tak aby wskazywa�a interpreter. Zasadniczo, podobnie jak w zwyk�ych skryptach pisanych np. w sh, linie rozpoczynaj�ce si� od znaku "#" s� ignorowane przez kompilator i pozwalaj� na umieszczanie w�asnych komentarzy wewn�trz programu.
�
2.2 Pierwszy program.
Oto najprostszy program w Perlu wypisuj�cy na ekranie tekst:
�
#!/usr/bin/perl
print 'Hello World.';
Nale�y pami�ta� o tym, �e ka�d� operacj� oddzielamy od nast�pnej za pomoc� �rednika.
�
2.3 Uruchamianie programu.
Aby uruchomi� nasz program, nale�y zapisa� go w zwyk�ym pliku tekstowym. Mo�emy u�y� do tego celu jakiegokolwiek edytora. Nast�pnie nadajemy plikowi odpowiedni atrybut wykonywalno�ci poleceniem: chmod u+x nazwa_pliku. Uruchamiamy program, wywo�uj�c go z linii komend:
�
nazwa_programu # je�li znajduje si� on w katalogu na �cie�ce
./nazwa_programu # je�li nie znajduje si� w katalogu na �cie�ce, ale
# jest w katalogu bie��cym
perl nazwa_programu # podaj�c go jako parametr dla interpretera (w tym
# przypadku atrybut wykonywalno�ci pliku nie musi
# by� ustawiony)
Istnieje jeszcze inny, czasem przydatny spos�b uruchamiania program�w. Opcja interpretera -e mo�e by� u�yta do wprowadzenia pojedynczej linii skryptu, np. perl -e "print 'Hello World.';". Mo�liwe jest wielokrotne u�ycie opcji -e i budowanie w ten spos�b skryptu o wielu liniach, np. perl -e "print 'Hello World. ';" -e "print 'Hello once again.'".
Aby sprawdzi� poprawno�� sk�adni jakiego� programu, ale nie uruchamia� go, nale�y interpreter wywo�a� z opcj� -c.
Inn� pomocn� i stosunkowo now� w j�zyku opcj� interpretera jest -w. Powoduje ona wypisanie komunikat�w dotycz�cych aktualnie wykonywanego skryptu. Cz�sto dzi�ki niej mo�emy odnale�� usterki niezauwa�one w procesie kompilacji, a mimo to istotne dla dzia�ania programu.
�
3. Zmienne i tablice zmiennych.
3.1 Zmienne.
W Perlu korzystanie ze zmiennych zosta�o maksymalnie uproszczone. Nie trzeba ich tu w �aden specjalny spos�b deklarowa�. Do wszelkich zmiennych skalarnych odwo�ujemy si� umieszczaj�c przed ich nazw� znak dolara. Przypisanie zmiennej $a warto�ci liczbowej 123 b�dzie mia�o posta�:
�
$a = 123;
Aby przypisa� zmiennej odpowiedni� warto�� �a�cuchow�, napiszemy pami�taj�c o apostrofach:
�
$a = 'xxx';
Wypisywali�my ju� zwyk�y tekst. Teraz pozostaje t� sam� czynno�� powt�rzy� ze zmiennymi. Du�e znaczenie maj� u�yte apostrofy.
�
$a = 'jeden';
$b = 'dwa';
$c = 'trzy';
print $a.' - '.$b.' - '.$c; # wypisze: jeden - dwa - trzy
print '$a - $b - $c'; # wypisze: $a - $b - $c
print "$a - $b - $c"; # wypisze: jeden - dwa - trzy
Tekst zawarty w pojedynczym apostrofie jest traktowany jak zwyk�y ci�g znak�w. Tekst zawarty w podw�jnym apostrofie mo�e zawiera� nazwy zmiennych, kt�re zostan� podmienione na ich warto�ci, jak r�wnie� specjalne znaki, np. \t (tabulator), \n (nowa linia).
Kompilator rozr�nia wielkie i ma�e litery ($A to nie to samo co $a).
Nazwy zmiennych dobierane s� dowolnie. Mog� nimi by� dowolne kobinacje liter i cyfr (poza kilkoma wyj�tkami, np. $_) o nieograniczonej d�ugo�ci.
�
3.2 Tablice zmiennych.
Szerokie zastosowanie w programowaniu znajduj� z pewno�ci� tablice zmiennych. Du�a wygoda ich u�ycia w Perlu wynika m.in. z tego, �e nie posiadaj� one okre�lonych rozmiar�w, rosn� w miar� potrzeb. Aby stworzy� tablic� i zapisa� w niej warto�ci, napiszemy:
�
@imiona = ("kazik", "tomek", "marek");
Z tak przygotowanej tablicy mo�emy pobiera� poszczeg�lne elementy, a tak�e je zapisywa�. Nale�y pami�ta�, �e pola tablicy s� numerowane pocz�wszy od zera.
�
$imiona[0] # tak przedstawiany jest pierwszy element tablicy
$imiona[1] = 'zyzio'; # tak zapisujemy do drugiego pola tablicy
Ka�dy element tablicy to zwyk�a zmienna skalarna, dlatego w celu odwo�ania si� do niej u�ywamy znaku dolara a nie "ma�pki".
W ten spos�b dodajemy do tablicy nowe elementy:
�
push(@imiona, "kasia"); # dodanie kolejnego (czwartego)
# elementu do tablicy @imiona
push(@imiona, "kasia", "ma�gosia") # dodanie dw�ch nowych element�w
# na raz
@damy = ("kasia", "ma�gosia");
push(@imiona, @damy); # dodanie dw�ch tablic do siebie
Tak usuwamy ostatni element tablicy i jednocze�nie go zwracamy:
�
$a = pop(@imiona); # $a b�dzie zawiera� warto�� ostatniego,
# usuni�tego elementu tablicy @imiona
Mo�liwe jest przyporz�dkowywanie zmiennym skalarnym tablic. Znowu nale�y zwr�ci� uwag� na u�ycie apostrof�w.
�
$a = @imiona; # zmienna $a b�dzie zawiera� liczb� element�w tablicy
$a = "@imiona"; # zmienna $a b�dzie �a�cuchem sk�adaj�cym si� z
# kolejnych element�w tablicy @imiona odzielonych spacjami
Numer ostatniego elementu tablicy otrzymujemy dzi�ki zastosowaniu zapisu:
�
$#imiona
Mo�liwe jest ustalanie spodziewanych wielko�ci tablic przez przypisywanie odpowiednich warto�ci powy�szej zmiennej. Ma to na celu przyspieszenie dzia�ania programu.
Pozosta�a jeszcze kwestia wypisywania zawarto�ci tablic:
�
print @imiona; # wypisuje elementy tablicy jednym ci�giem
print "@imiona"; # wypisuje elementy, oddziela je od siebie spacjami
print @imiona.""; # wypisuje ilo�� element�w tablicy
�
3.3 Tablica @ARGV.
W specjalnej tablicy o nazwie @ARGV zapisane s� wszystkie opcje podane w linii komend przy starcie programu. Aby wypisa� pierwsz� opcj�, napiszemy:
�
print("$ARGV[0]");
Nast�puj�cy program zako�czy swe dzia�anie odpowiednim komunikatem, je�li oka�e si�, i� zosta� wywo�any z jakimikolwiek parametrami:
�
if (@ARGV)
{
print "Program zosta� wywo�any z parametrami!\n";
}
�
3.4 Tablice asocjacyjne.
Poza przedstawionymi ju� zwyk�ymi tablicami istniej� jeszcze tablice asocjacyjne. Zasadnicz� r�nic� mi�dzy zwyk�� tablic� a tablic� asocjacyjn� jest spos�b odwo�ywania si� do poszczeg�lnych ich element�w: w zwyk�ej tablicy ka�demu elementowi odpowiada�a liczba, podczas gdy w tablicach asocjacyjnych ka�demu elementowi b�dzie przyporz�dkowany �a�cuch. W odr�nieniu od zwyk�ych tablic przed nazwami tablic asocjacyjnych stawiamy znak procenta. Przyk�adowo stworzymy tablic� asocjacyjn� zawieraj�c� liczby oznaczaj�ce wiek danych os�b:
�
%wiek = ("kazik", 17,
"tomek", 20,
"marek", 31);
Aby odczyta� interesuj�c� nas informacje z wcze�niej przygotowanej tablicy asocjacyjnej, napiszemy:
�
$wiek{"marek"} # to wyra�enie zwr�ci warto�� 31
Poniewa� w polach tablicy asocjacyjnej zapisane s� zmienne skalarne, do ich odczytu u�ywamy znaku dolara.
Mo�liwe jest konwertowanie zwyk�ych tablic do tablic asocjacyjnych i na odwr�t:
�
@tab = %wiek; # od tej chwili @tab = ("marek", "31", "tomek",
# "20", "kazik", "17");
%nowa = @tab # od tej chwili %nowa jest tak� sam� tablic� jak
# %wiek
�
3.5 Tablica asocjacyjna %ENV.
Program wykonywany w systemie UN*X mo�e odwo�ywa� si� do zmiennych �rodowiskowych, kt�re cz�sto zawieraj� przydatne informacje. (Aby dowiedzie� si� o aktualnie ustalonych zmiennych �rodowiskowych, prosz� wyda� polecenie set). Perl standardowo udost�pnia nam ca�y zestaw tych zmiennych. S� one umieszczone w tablicy asocjacyjnej o nazwie %ENV.
�
print "Ty jeste� $ENV{'USER'}, witam!"; # zmienna �rodowiskowa USER zawiera
# aktualn� nazw� u�ytkownika
�
4. Operatory.
4.1 Operatory liczbowe.
Oto najwa�niejsze operacje (nb. wi�kszo�� z nich pochodzi z j�zyka C), jakim mo�emy podda� zmienne liczbowe:
�
$x = 4 + 2; # dodawanie (w wyniku $x = 6)
$x = 4 - 2; # odejmowanie (w wyniku $x = 2)
$x = 4 * 2; # mno�enie (w wyniku $x = 8)
$x = 4 / 2; # dzielenie (w wyniku $x = 2)
$x = 4 ** 2; # pot�gowanie (w wyniku $x = 16)
$x = 4 % 2; # reszta z dzielenia (w wyniku $x = 0)
Nast�puj�ce operatory s�u�� do automatycznego zwi�kszania lub zmniejszania warto�ci zmiennych:
�
++$a; # zwi�kszenie $a o jednostk� i zwr�cenie warto�ci
$a++; # zwr�cenie warto�ci $a i zwi�kszenie jej o jednostk�
--$a; # zmniejszenie $a o jednostk� i zwr�cenie warto�ci
$a--; # zwr�cenie warto�ci $a i zmniejszenie jej o jednostk�
Warto tutaj nadmieni�, i� operator inkrementacji mo�e zosta� u�yty tak�e wzgl�dem zmiennych �a�cuchowych. W takim przypadku cyfry zmniejszaj� si� lub zwi�kszaj�, litery za� zostaj� odpowiednio przesuni�te w alfabecie.
�
4.2 Operatory �a�cuchowe.
A oto przyk�ady innych, przeznaczonych do dzia�ania na �a�cuchach operator�w:
�
$a = 'Lin';
$b = 'ux'; # "sklejenie" dw�ch �a�cuch�w - zmienna $c w efekcie
$c = $a . $b; # zawiera� b�dzie s�owo "Linux"
$a = 'mas�o';
$b = 10; # zmienna $c b�dzie zawiera� �a�cuch z�o�ony z dziesi�ciu
$c = $a x $b; # "sklejonych" �a�cuch�w $a
�
4.3 Ustalanie warto�ci zmiennych.
Ustala� warto�ci zmiennych mo�emy na wiele sposob�w. Dla przyk�adu przyjmijmy, �e ka�de z poni�szych przypisa� jest wykonywane z osobna dla zmiennych $a = 2 i $b = 3:
�
$a = $b # przypisanie $a do $b (w wyniku $a = 3, $b = 3)
$a += $b # dodanie $b do $a (w wyniku $a = 5, $b = 3)
$a -= $b # odj�cie $b od $a (w wyniku $a = -1, $b = 3)
$a .= $b # dopisanie $b do $a (w wyniku $a = 23, $b = 3)
5. Instrukcje.
5.1 Instrukcja foreach.
Dzi�ki instrukcji foreach mo�emy przemieszcza� si� kolejno poprzez elementy tablicy lub kolejne linie pliku tekstowego i wykonywa� na nich operacje. Dla przyk�adu wykorzystamy wcze�niej ju� u�ywan� tablic� @imiona:
�
foreach $imie (@imiona) # ka�dy kolejny element tablicy @imiona
# b�dzie chwilowo dost�pny pod zmienn� $imie
{
print "KTO : ";
print "$imie\n";
}
Nawiasy klamrowe, jakie pojawi�y si� powy�ej, s� u�ywane do okre�lania bloku programu, czyli zbioru instrukcji i wyra�e�. W tym akuratnie przypadku za ka�dym podstawieniem pod zmienn� $imie nowej warto�ci wykonywane s� dwie czynno�ci. Instrukcja foreach odnosi si� do obydwu z nich.
�
5.2 Testy.
Rozwa�ymy teraz kilka wyra�e� testuj�cych. Testy por�wnuj� ze sob� zmienne lub warto�ci i zwracaj� prawd� lub fa�sz. W Perlu ka�da liczba r�na od zera i ka�dy �a�cuch, kt�ry nie jest pusty, jest uznawany za prawd�, za� liczba 0 lub pusty �a�cuch za fa�sz. I tak:
�
$a == $b # prawda je�li $a jest liczbowo r�wne $b
$a != $b # prawda je�li $a jest liczbowo r�ne od $b
$a eq $b # prawda je�li �a�cuch $a jest taki sam jak $b
$a ne $b # prawda je�li �a�cuchy $a i $b si� r�ni�
A tak u�ywamy logicznych warto�ci AND, OR, NOT:
�
($a && $b) # Czy $a i $b s� prawd�?
($a || $b) # Czy $a lub $b jest prawd�?
(!$a) # Czy $a to fa�sz?
�
5.3 Instrukcja if.
Przedstawione powy�ej testy znajduj� zastosowanie m.in. w budowaniu instrukcji warunkowych, kt�rych og�lna posta� wygl�da nast�puj�co:
�
if test1
{
operacje1;
}
elsif test2
{
operacje2;
}
else
{
operacje3;
}
Instrukcje takie dzia�aj� na nast�puj�cej zasadzie: Je�li oka�e si�, �e test1 wykazuje warto�� prawda, to zostaje wykonany pierwszy blok programu - operacje1. Je�li test1 si� nie powiedzie, to zostaje przeprowadzony test2 i, je�li ten si� powiedzie, wykonanywane s� operacje2. (Jedna instrukcja warunkowa mo�e zawiera� wiele cz�on�w elsif). Nast�pny, zaczynaj�cy si� od s�owa else cz�on instrukcji dotyczy przypadku, w kt�rym �aden z wcze�niejszych test�w si� nie powi�d�. (W najprostszym razie cz�ony elsif i else nie musz� si� w og�le pojawi�).
Przyk�adowo ta instrukcja warunkowa sprawdzi, czy �a�cuch $a jest pusty czy te� zawiera jeden, dwa a mo�e wi�cej znak�w, a nast�pnie wypisze odpowiedni komunikat:
�
if (!$a) # czy �a�cuch $a zwraca fa�sz?
{
print "�a�cuch jest pusty.\n";
}
elsif (length($a) == 1) # czy �a�cuch $a ma jeden znak?
{
print "�a�cuch sk�ada si� z jednego znaku.\n";
}
elsif (length($a) == 2) # czy �a�cuch $a ma dwa znaki?
{
print "�a�cuch sk�ada si� z dw�ch znak�w.\n";
}
else # gdy ilo�� znak�w > 2
{
print "�a�cuch sk�ada si� z wielu znak�w.\n";
}
�
5.4 Instrukcja unless.
Za pomoc� instrukcji unless mo�emy w jeszcze inny spos�b sprawdza� prawdziwo�� test�w i na tej podstawie wykonywa� stosowne operacje. Mo�liwe s� dwa, r�wnowa�ne sposoby budowania instrukcji unless:
�
operacja unless test;
unless test operacja;
Dzia�anie tej instrukcji polega na tym, �e operacja jest wykonywana, chyba �e test zwraca warto�� prawda. Przyk�adowo:
�
die unless ($l); # zako�cz dzia�anie programu, je�eli zmienna $l jest pusta
�
5.5 P�tla for.
Poznamy teraz zasad� budowania podstawowej, pochodz�cej bezpo�rednio z j�zyka C p�tli for. W og�lno�ci p�tla ta wygl�da nast�puj�co:
�
for (inicjalizacja; test; zmiana_warto�ci)
{
operacje;
}
Na pocz�tku p�tli for wykonywana jest inicjalizacja. Nast�pnie przeprowadzany jest test i je�li zwr�ci on warto�� prawda, zostaj� wykonane operacje. W ostatnim etapie ma miejsce zmiana_warto�ci, kt�ra najcz�ciej polega na zwi�kszeniu o jednostk� zmiennej ustalonej podczas inicjalizacji. (Zmiana_warto�ci jest wyra�eniem wykonywanym zawsze, w ka�dym przebiegu p�tli). Ca�a p�tla wykonywana jest dop�ki test nie zwr�ci fa�szu.
Oto przyk�ad p�tli for, kt�ra wypisze cyfry od 0 do 9:
�
for ($a = 0; $a < 10; ++$a)
{
print "$a\n";
}
�
5.6 P�tla while.
Inny spos�b zap�tlania uzyskujemy dzi�ki instrukcji while. Og�lna jej konstrukcja przedstawia si� nast�puj�co:
�
while test
{
operacje;
}
continue
{
operacje;
}
Dzia�anie jej polega na ci�g�ym wykonywaniu bloku operacji, je�li tylko test zwraca prawd�. Drugi cz�on (pocz�wszy od s�owa continue) nie jest niezb�dny, a jego rola jest taka sama jak elementu zmiana_warto�ci w p�tli for - wyra�enie to jest wykonywane w ka�dym przebiegu p�tli.
Oto przyk�ad p�tli while, kt�ra pyta u�ytkownika o wynik dzia�ania matematycznego i powtarza swoje pytanie, dop�ki nie uzyska poprawnej odpowiedzi:
�
print 'Ile to jest 2*2, hmm? ';
$a = <STDIN>; # tak czytamy dane ze standardowego wej�cia
chop($a); # odci�cie znaku ko�ca linii
while($a ne 4) # powtarzaj, dop�ki u�ytkownik nie poda dobrego wyniku
{
print "Niestety to z�y wynik!\nSpr�buj ponownie: ";
$a = <STDIN>;
chop($a);
}
print "Jako� Ci si� uda�o.\n";
�
5.7 Instrukcja goto.
W Perlu, podobnie jak w wi�kszo�ci innych j�zyk�w, istnieje instrukcja goto, pomimo �e mo�na j� w ka�dym przypadku z powodzeniem zast�pi� p�tlami. (Jej nadu�ywanie nie nale�y do kunsztu programistycznego). Posta� instrukcji goto jest nast�puj�ca:
�
operacje;
znacznik:
operacje;
goto znacznik;
Instrukcja powoduje zatrzymanie programu i przeskok do punktu, w kt�rym zosta� umieszczony znacznik.
Poni�szy program po uruchomieniu b�dzie wypisywa� na ekranie dane s�owo w niesko�czono��:
�
re: # znacznik
print " HEJ ! "; # dalszy ci�g programu
goto re; # przeskok wstecz do znacznika
W Perlu budowanie instrukcji jest dosy� dowolne. Ten sam efekt bardzo cz�sto mo�emy uzyska� na wiele sposob�w, a wybranie jednego z nich zale�y wy��cznie od w�asnych upodoba�.
�
5.8 Przyk�ady.
Oto przyk�adowy program obliczaj�cy sum� algebraiczn� z podanych przez u�ytkownika liczb. Wykorzystuje on poznane wcze�niej instrukcje:
�
do # tak te� mo�na
{
print "Prosz� poda� liczb� : ";
$liczba = <STDIN>;
$efekt += $liczba;
++$numer;
}
until ($liczba eq "\n"); # dop�ki u�ytkownik przestanie
# wprowadza� liczby
if ($numer != 0)
{
$sr = $efekt / $numer;
print "�rednia arytmetyczna podanych liczb : $sr\n";
}
Ten przyk�adowy program natomiast s�u�y do odnajdywania liczb pierwszych wed�ug do�� prymitywnego algorytmu:
�
print "Prosz� poda� liczb� : ";
$l = <STDIN>;
chop($l);
for($i = 2; $i < $l; $i++)
{
if (($l % $i) == 0)
{
print "Liczba $l nie jest pierwsza!\n";
exit;
}
}
print "Liczba $l jest pierwsza!\n";
6. Obs�uga plik�w tekstowych.
Ka�dy plik przed zapisem lub odczytem nale�y otworzy�, a po zako�czeniu operacji na nim - zamkn��. Do otwarcia jakiegokolwiek pliku w j�zyku Perl s�u�y rozbudowana funkcja open, za� do zamkni�cia - close. Nie ma �adnych limit�w ilo�ci otwieranych plik�w w Perlu poza zewn�trznymi, systemowymi. Schemat obs�ugi pliku jest prosty:
�
open(DANE, �cie�ka_do_pliku); # otwarcie pliku (DANE to przyk�adowa nazwa)
[ ... ] # operacje na nim
close(DANE); # zamkni�cie pliku
Plik jednak�e mo�e zosta� otwarty na kilka sposob�w:
�
open(DANE, �cie�ka_do_pliku); # dwa sposoby otwarcia
open(DANE, "<�cie�ka_do_pliku"); # pliku do odczytu
open(DANE, ">�cie�ka_do_pliku"); # otwarcie pliku do zapisu
open(DANE, ">>�cie�ka_do_pliku"); # otwarcie pliku do dopisywania
Cz�sto przydatn� rol� w lokalizacji plik�w na dysku pe�ni� rozszerzenia sh. Mo�na z nich skorzysta�, kiedy ujmiemy �cie�k� do pliku w odpowiednie nawiasy. Na przyk�ad chc�c otworzy� plik znajduj�cy si� w katalogu domowym u�ytkownika, napiszemy:
�
open(DANE, <~/plik.txt>);
Najprostszym przypadkiem wyprowadzania danych z pliku b�dzie wczytanie do tablicy ca�ej zawarto�ci pliku tekstowego:
�
open(F, '/etc/passwd'); # otwarcie pliku do odczytu
@tekst = <F>; # zapisanie tekstu z pliku w tablicy (ka�da linia
# zostaje umieszczona z osobna, w jednym polu tablicy)
close(F); # zamkni�cie pliku
A tak zapisujemy dane do pliku:
�
open(DANE, '>dane.txt'); # otwarcie pliku do zapisu
print DANE "Tekst zapisywany do pliku.\n"; # zapisanie tekstu do pliku
close(DANE); # zamkni�cie pliku
Za pomoc� funkcji open mo�emy tak�e otwiera� i zamyka� standardowe wej�cie (najcz�ciej klawiatura) i wyj�cie (najcz�ciej ekran).
�
open(DANE, '-'); # otwarcie standardowego wej�cia
open(DANE, '>-'); # otwarcie standardowego wyj�cia
Funkcja open mo�e tak�e zosta� u�yta do otwierania strumieni w �rodowiskach wieloprocesowych. W poni�szym przyk�adzie posortujemy kilka �a�cuch�w przy u�yciu zewn�trznej komendy sort:
�
open(SORT, "|sort"); # otwarcie strumienia
print SORT ("d\n", "z\n", "a\n");
close SORT;
7. Manipulacje �a�cuchami.
Obs�uga �a�cuch�w jest jedn� z mocnych stron Perla. Oferuje on du�e mo�liwo�ci w tej dziedzinie. Na pocz�tek podam spos�b sprawdzania, czy dane wyra�enie wyst�puje czy te� nie wyst�puje w przeszukiwanym �a�cuchu:
�
$s =~ /Ala/ # wyra�enie to zwr�ci warto�� prawda, je�eli oka�e si�, �e
# �a�cuch $s zawiera szukane s�owo zawarte w pochy�ym nawiasie
$s !~ /Ala/ # wyra�enie to zwr�ci warto�� prawda, je�eli oka�e si�, �e
# �a�cuch $s nie zawiera szukanego s�owa zawartego w pochy�ym
# nawiasie
�
7.1 Zmienna $_.
Nada�y�a si� dobra okazja, aby przedstawi� zmienn� $_, kt�ra jest domy�ln� zmienn� i na kt�rej operuje wiele funkcji wtedy, gdy inna zmienna nie zosta�a do konkretnego celu wyszczeg�lniona. Takie rozwi�zanie skraca nieco kod oraz eliminuje zbyt du�� liczb� zmiennych i mog�ce z tego wynikn�� zamieszanie.
�
$s = 'Ala ma kota.';
if ($s =~ /Ala/)
{
print 'Odnaleziono wyraz Ala!';
}
Powy�szy zapis jest r�wnowa�ny nast�puj�cemu:
�
$_ = 'Ala ma kota.';
if (/Ala/)
{
print 'Odnaleziono wyraz Ala!';
}
�
7.2 Maski.
Kiedy poszukujemy w danym �a�cuchu konkretnego zapisu, korzystamy cz�sto z wielu znak�w o specjalnym znaczeniu, umieszczanych wewn�trz pochy�ego nawiasu. Te znaki to:
�
. # jakikolwiek znak opr�cz znaku nowej linii (\n)
^ # rozpocz�cie nowej linii lub �a�cucha
$ # koniec linii lub �a�cucha
* # dowolna ilo�� powt�rze� ostatniego znaku
+ # jedno lub wi�cej powt�rze� ostatniego znaku
? # brak lub jedno wyst�pienie ostatniego znaku
Za pomoc� powy�szych znak�w specjalnych mo�na budowa� maski i por�wnywa� je ze zmiennymi. Oto kilka przyk�adowych masek:
�
.* # �a�cuch sk�adaj�cy si� z dowolnych znak�w opr�cz znak�w ko�ca linii
^$ # pusta linia
.*x$ # dowolny ci�g znak�w, kt�ry ko�czy si� liter� "x"
Zwyk�ych nawias�w mo�emy u�ywa� do grupowania znak�w:
�
(.*)* # dowolna ilo�� dowolnych �a�cuch�w
(^$)+ # jedna lub wi�cej pustych linii
(.*x$)* # dowolna ilo�� �a�cuch�w zako�czonych liter� "x"
Je�li chcemy odnale�� kt�rykolwiek znak spo�r�d kilku, nale�y je umie�ci� w nawiasach kwadratowych. I tak:
�
[abc] # kt�rykolwiek ze znak�w: a, b lub c
[^abc] # negacja: ani a ani b ani c
[a-z] # jakiekolwiek znaki od a do z
[^a-z] # jakiekolwiek znaki opr�cz znak�w od a do z
Nawiasy klamrowe s�u�� do okre�lania ilo�ci powt�rze� wyst�pienia �a�cucha:
�
(.*){3} # trzy dowolne �a�cuchy
(^$){3,} # przynajmniej trzy dowolne �a�cuchy
(.*x$){3,5} # przynajmniej trzy, ale nie wi�cej ni� pi�� �a�cuch�w
# zako�czonych liter� "x"
Aby w masce zawrze� znaki, kt�re maj� pierwotnie swoje znaczenie w j�zyku (np. $) nale�y je poprzedzi� znakiem "\". Na przyk�ad:
�
\^
\$
\*
Ponadto w masce niekt�re litery poprzedzone znakiem "\" nabieraj� specjalnego znaczenia:
�
\n # znak nowej linii
\t # tabulator
\a # alarm
\l # nast�pny znak ma by� ma�� liter�
\u # nast�pny znak ma by� du�� liter�
\L # nast�pne znaki maj� by� ma�ymi literami, a� do wyst�pienia \E
\U # nast�pne znaki maj� by� du�ymi literami, a� do wyst�pienia \E
\w # pojedynczy znak alfanumeryczny
\W # jakikolwiek znak nie b�d�cy znakiem alfanumerycznym
\s # spacja
\S # jakikolwiek znak, kt�ry nie jest spacj�
\d # liczba
\D # jakikolwiek znak, kt�ry nie jest liczb�
Na przyk�adzie poka�� spos�b "wy�uskiwania" pewnych cz�ci �a�cuch�w za pomoc� por�wnywania ich z maskami:
�
$_ = 'linux Operating system';
/([A-Z][a-z]+\s)+/; # wykorzystanie w�a�ciwo�ci zmiennej $_
Po wykonaniu takiej czynno�ci do naszej dyspozycji zostaje oddany szereg pseudo-zmiennych, kt�rych warto�ci mo�na jedynie czyta�, ale nie zapisywa�. Jak wida� maska, kt�rej u�yli�my, opisuje s�owo "Operating". Z tego wzgl�du w zmiennej $& odnajdziemy to s�owo. Pod zmienn� $` natomiast zapisane zostanie s�owo "linux", a pod $' s�owo "system". Dzi�ki temu mechanizmowi jeste�my w stanie "wy�uska�" potrzebn� nam cz�� �a�cucha.
Przy przeszukiwaniu �a�cuch�w wszystkie odnalezione wyra�enia zawarte w zwyk�ych nawiasach s� zapami�tywane w pseudo-zmiennych $1, $2, $3, itd. Mo�na je tak�e wykorzysta� w ramach aktualnie wykonywanej funkcji odwo�uj�c si� do nich poprzez \1, \2, \3, itd.
�
$_ = 'Linux Operating System';
if (/(.*ux)/)
{
print "$1\n"; # znaleziony �a�cuch "Linux"
}
�
7.3 Funkcja s///.
Bardzo pomocn� funkcj� wykorzystuj�c� maski jest s///. S�u�y ona do podmieniania zawarto�ci jednego wyra�enia innym.
�
s/linux/Linux/ # przeszukiwany jest �a�cuch $_, a gdy oka�e si�, �e
# zawiera on wyra�enie "linux", zostanie ono
# podmienione na �a�cuch "Linux"
s/linux/Linux/g # przeszukiwany jest �a�cuch $_ i wszystkie
# wyst�pienia wyra�enia "linux" zostan� podmienione
# na �a�cuch "Linux"
s/linux/Linux/gi # przeszukiwany jest �a�cuch $_ i wszystkie
# wyst�pienia wyra�enia "linux" (niezale�nie od
# wielko�ci poszczeg�lnych liter) zostan�
# podmienione na �a�cuch "Linux"
Przyk�ad zastosowania funkcji s///:
�
$_ = 'Linux Operating System';
s/([A-Z])/:\1:/g; # ka�da pojawiaj�ca si� wielka litera
# zostanie zawarta w dwukropkach
�
7.4 Funkcja tr///.
Do podmieniania znak�w innymi znakami s�u�y funkcja tr///. Na przyk�ad:
�
$_ = 'LinuX';
tr/A-Z/a-z/; # podmienienie wszystkich du�ych liter na ma�e
$_ = 'linux';
tr/x/s/; # podmienienie litery "x" na "s"
�
7.5 Funkcja split().
Przydatn� funkcj� w Perlu jest split. Pozwala ona na rozbicie �a�cucha i umieszczenie poszczeg�lnych jego cz�ci w tablicy:
�
$s = 'kazik:tomek:marek';
@tab = split(/:/, $s);
Po wykonaniu takiej operacji otrzymamy poszczeg�lne cz�ci �a�cucha, kt�re w $s by�y odgraniczane znakiem dwukropka, zapisane w kolejnych polach tablicy. Efekt dzia�ania funkcji split b�dzie wygl�da� tak:
�
@tab = ("kazik", "tomek", "marek");
Oczywi�cie w miejsce pojedynczego znaku dwukropka mo�emy wprowadzi� dowolne maski, kt�re b�d� opisywa� wyra�enia oddzielaj�ce od siebie szukane �a�cuchy.
Funkcja split mo�e tak�e by� stosowana w kr�tszej postaci (operowa� na zmiennej $_):
�
$_ = 'Linux, Operating System';
@tab = split(/.*\s/);
W efekcie otrzymamy tablic� @tab sk�adaj�c� si� z trzech wyraz�w ("Linux", "Operating", "System") zapami�tanych w kolejnych jej polach.
�
7.6 Funkcja substr().
Funkcja substr pozwala na "wycinanie" cz�ci �a�cucha. Pos�uguj�c si� ni� podajemy miejsce, w kt�rym rozpoczyna si� szukany wycinek �a�cucha i ewentualnie d�ugo�� tego wycinka.
�
$s = substr('Ala ma kota', 2, 6); # �a�cuch $s b�dzie zawiera� "a ma k"
^ ^
$s = substr('Ala ma kota', 6); # �a�cuch $s b�dzie zawiera� "kota"
^
$s = substr('Ala ma kota', -4, 3); # �a�cuch $s b�dzie zawiera� "kot"
^ ^
8. Procedury.
Jak w prawie ka�dym j�zyku tak i w Perlu mo�emy zapisa� cz�� kodu w postaci procedur i odwo�ywa� si� do nich w p�niejszym biegu programu. Procedury systematyzuj� i skracaj� kod programu. W Perlu sk�adaj� si� one ze s�owa kluczowego sub i nast�puj�cego po nim bloku operacji. Przyk�adowo:
�
sub moja
{
print "To moja procedura.";
}
Tak zapisan� procedur� mo�emy wywo�ywa� w dalszej cz�ci programu:
�
while (true) # p�tla niesko�czona
{
&moja; # wywo�anie procedury
}
Do procedury mo�emy przekazywa� zmienne pochodz�ce z innych cz�ci programu, wywo�uj�c j� w nast�puj�cy spos�b:
�
&moja(12); # wywo�anie procedury z jednym parametrem
&moja(12, $_); # wywo�anie procedury z dwoma parametrami
Prosta procedura, jak� stworzyli�my, nie reaguje w �aden spos�b na przekazywane jej zmienne.
We wn�trzu procedury do przekazanych jej zmiennych mo�emy dosta� si� poprzez tablic� o nazwie @_:
�
sub moja2
{
print "Procedura zosta�a wywo�ana z nast�puj�cymi parametrami :\n";
print @_;
}
Stworzone przez nas procedury same tak�e zwracaj� warto�ci.
�
sub moja3
{
if ($_[0] > $_[1])
{
$_[0];
}
else
{
$_[1];
}
}
Procedura moja3 wywo�ana z dwoma zmiennymi sprawdza, kt�ra z nich jest wi�ksza i zwraca jej warto��. A oto jej konkretne zastosowanie:
�
$wieksza = &moja3(12, 32); # zostanie odnale�ona wi�ksza z dw�ch
# liczb i umieszczona w zmiennej $wieksza
"Artyku� �ci�gni�ty ze strony Kazimierza Pietruszewskiego:
http://pipeta.chemia.pk.edu.pl/Perl/"