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