plik


ÿþIDZ DO IDZ DO PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ Perl dla Srednio SPIS TRESCI SPIS TRESCI zaawansowanych KATALOG KSI¥¯EK KATALOG KSI¥¯EK Autorzy: Randal L. Schwartz, Brian d foy, Tom Phoenix T³umaczenie: Tomasz Walczak KATALOG ONLINE KATALOG ONLINE ISBN: 83-246-0615-7 Tytu³ orygina³u: Intermediate Perl ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG Format: B5, stron: 264 Poznaj zasady programowania obiektowego w Perlu TWÓJ KOSZYK TWÓJ KOSZYK " Utwórz i wykorzystaj modu³y DODAJ DO KOSZYKA DODAJ DO KOSZYKA " Opanuj tajniki stosowania przestrzeni nazw " UmieSæ dystrybucje swoich programów w archiwum CPAN Perl jest uniwersalnym i skutecznym jêzykiem programowania maj¹cym wiele CENNIK I INFORMACJE CENNIK I INFORMACJE zastosowañ. Mo¿na wykorzystywaæ go do zarz¹dzania systemami, tworzyæ za jego pomoc¹ dynamiczne witryny internetowe i manipulowaæ danymi zgromadzonymi ZAMÓW INFORMACJE ZAMÓW INFORMACJE w tabelach baz danych. ProgramiSci stosuj¹cy Perla twierdz¹, ¿e dziêki niemu ³atwe O NOWOSCIACH O NOWOSCIACH zadania staj¹ siê jeszcze ³atwiejsze, a trudne  wykonalne. Mimo i¿ Perl by³ projektowany jako jêzyk nieobiektowy, mo¿na podczas programowania w nim stosowaæ równie¿ ZAMÓW CENNIK ZAMÓW CENNIK koncepcje obiektowe. Aby jednak u¿ywaæ obiektowego jêzyka Perl, najpierw warto zrozumieæ dzia³anie pakietów, referencji, tablic asocjacyjnych, tablic, procedur i modu³ów. CZYTELNIA CZYTELNIA Dziêki ksi¹¿ce  Perl dla Srednio zaawansowanych poznasz wszystkie komponenty jêzyka stanowi¹ce podstawê jego obiektowych w³aSciwoSci. Czytaj¹c j¹, nauczysz siê FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE korzystaæ z modu³ów i referencji, manipulowaæ z³o¿onymi strukturami danych za pomoc¹ pakietu Data::Dumper oraz pracowaæ z systemem plików. Przyswoisz sobie zasady programowania obiektowego oraz dowiesz siê, jak w Perlu tworzyæ obiekty i usuwaæ je oraz budowaæ aplikacje o skomplikowanej strukturze. Przeczytasz tak¿e o testowaniu kodu, opracowywaniu dystrybucji i umieszczaniu ich w archiwach CPAN. " Obs³uga list za pomoc¹ operatorów " Instalowanie modu³ów z archiwów CPAN " Korzystanie z modu³ów " Tworzenie tablic anonimowych i asocjacyjnych " WySwietlanie i przetwarzanie z³o¿onych danych " Obs³uga plików i katalogów za pomoc¹ referencji Wydawnictwo Helion " Sortowanie ul. KoSciuszki 1c " Obiekty i egzemplarze 44-100 Gliwice " Wywo³ywanie metod tel. 032 230 98 63 " Usuwanie obiektów e-mail: helion@helion.pl " Tworzenie dystrybucji " Pisanie skryptów testowych " Tworzenie w³asnych modu³ów Test::* Poznaj obiektowe w³aSciwoSci jêzyka Perl Spis tre[ci Przedmowa .....................................................................................................................9 Wstp .............................................................................................................................11 1. Wprowadzenie ..............................................................................................................17 Co powiniene[ umie?18 Po co s przypisy? 18 A co z wiczeniami? 18 Co powiniene[ zrobi, je[li prowadzisz zajcia z jzyka Perl? 19 2. Podstawy dla [rednio zaawansowanych .....................................................................21 Operatory do obsBugi list 21 Przechwytywanie bBdów przy u|yciu funkcji eval 24 Dynamiczne kodowanie przy u|yciu funkcji eval 25 wiczenia 26 3. U|ywanie moduBów .....................................................................................................29 Dystrybucja standardowa 29 U|ywanie moduBów 30 Interfejsy funkcyjne 30 Wybór importowanych elementów 31 Interfejsy obiektowe 32 Bardziej typowy moduB obiektowy  Math::BigInt 32 Archiwum CPAN 33 Instalowanie moduBów z archiwum CPAN 33 Ustawianie [cie|ki w odpowiednim momencie 35 wiczenia 37 3 4. Wprowadzenie do referencji .......................................................................................39 Wykonywanie tych samych operacji na wielu tablicach 39 Pobieranie referencji do tablicy 41 Dereferencja referencji do tablicy 42 Pozbywanie si nawiasów 43 Modyfikowanie tablic 44 Zagnie|d|one struktury danych 44 Upraszczanie referencji do zagnie|d|onych elementów przy u|yciu strzaBek 46 Referencje do tablic asocjacyjnych 47 wiczenia 49 5. Referencje i zasig .........................................................................................................51 Wiele referencji do tych samych danych 51 Co si stanie, je[li to byBa ta nazwa? 52 Zliczanie referencji a zagnie|d|one struktury danych 53 Co zrobi, kiedy zliczanie referencji nie dziaBa? 55 Bezpo[rednie tworzenie tablic anonimowych 56 Tworzenie anonimowych tablic asocjacyjnych 59 Automatyczne tworzenie referencji anonimowych 60 Automatyczne tworzenie anonimowych referencji i tablice asocjacyjne 63 wiczenia 64 6. Manipulowanie zBo|onymi strukturami danych ........................................................ 67 U|ywanie debugera do wy[wietlania zBo|onych danych 67 Wy[wietlanie zBo|onych danych przy u|yciu pakietu Data::Dumper 71 YAML 73 Zapisywanie zBo|onych danych przy u|yciu moduBu Storable 73 U|ywanie operatorów map i grep 75 Warstwa po[rednia 75 Wybieranie i modyfikowanie zBo|onych danych 77 wiczenia 78 7. Referencje do procedur ................................................................................................ 79 Referencje do procedur nazwanych 79 Procedury anonimowe 83 WywoBania zwrotne 85 Domknicia 85 Zwracanie procedury przez procedur 87 Zmienne domknicia jako dane wej[ciowe 90 Zmienne domknicia jako statyczne zmienne lokalne 90 wiczenie 91 4 | Spis tre[ci 8. Referencje do uchwytów plików .................................................................................93 Dawna technika 93 Lepszy sposób 94 Jeszcze lepszy sposób 95 IO::Handle 95 Referencje do uchwytów katalogów 100 wiczenia 100 9. Przydatne sztuczki z referencjami ............................................................................ 103 Przegld technik sortowania 103 Sortowanie przy u|yciu indeksów 105 Wydajne sortowanie 106 Transformacje Schwartza 107 Wielopoziomowe sortowanie przy u|yciu transformacji Schwartza 108 Rekurencyjnie zdefiniowane dane 108 Tworzenie rekurencyjnie zdefiniowanych danych 110 Wy[wietlanie rekurencyjnie zdefiniowanych danych 112 wiczenia 113 10. Tworzenie wikszych programów .............................................................................115 Lekarstwo na powtarzajcy si kod 115 Wstawianie kodu przy u|yciu funkcji eval 116 U|ywanie instrukcji do 117 U|ywanie instrukcji require 118 Instrukcja require i tablica @INC 120 Problem z kolizjami przestrzeni nazw 122 Pakiety jako separatory przestrzeni nazw 123 Zasig dyrektywy package 125 Pakiety i zmienne leksykalne 126 wiczenia 126 11. Wprowadzenie do obiektów ..................................................................................... 129 Gdyby[my mogli rozmawia ze zwierztami& 129 WywoBywanie metod przy u|yciu strzaBki 130 Dodatkowy parametr wywoBania metody 132 WywoBywanie drugiej metody w celu uproszczenia kodu 132 Kilka uwag o tablicy @ISA 133 PrzesBanianie metod 134 Rozpoczynanie przeszukiwania od innego miejsca 136 SUPER sposób 137 Co zrobi ze zmienn @_? 137 Gdzie doszli[my? 138 wiczenia 138 Spis tre[ci | 5 12. Obiekty z danymi ........................................................................................................ 139 KoD to koD  ale czy na pewno? 139 WywoBywanie metod egzemplarza 140 Dostp do danych egzemplarza 141 Jak utworzy konia? 141 Dziedziczenie konstruktora 142 Tworzenie metod dziaBajcych zarówno z klasami, jak i z egzemplarzami 143 Dodawanie parametrów do metod 143 Ciekawsze egzemplarze 144 KoD o innym kolorze 145 Pobieranie zapisanych danych 146 Nie zagldaj do pudeBka 147 Szybsze metody pobierajce i ustawiajce warto[ 148 Metody pobierajce warto[ci peBnice funkcje metod ustawiajcych warto[ 148 Metody dziaBajce tylko dla klasy lub tylko dla egzemplarza 149 wiczenie 150 13. Usuwanie obiektów ....................................................................................................151 Porzdkowanie po sobie 151 Usuwanie obiektów zagnie|d|onych 153 Konie nie do zajechania 155 Zapis dla obiektów po[rednich 156 Dodatkowe zmienne egzemplarza w klasach pochodnych 158 U|ywanie zmiennych klasy 160 OsBabianie argumentów 161 wiczenie 163 14. Wybrane zaawansowane zagadnienia z programowania obiektowego .............. 165 Metody UNIVERSAL 165 Testowanie poprawno[ci dziaBania obiektów 166 Metoda AUTOLOAD jako ostatnia deska ratunku 167 U|ywanie metody AUTOLOAD do obsBugi akcesorów 168 Aatwiejszy sposób tworzenia metod pobierajcych i ustawiajcych warto[ci 169 Dziedziczenie wielokrotne 171 wiczenia 171 15. Eksportowanie .............................................................................................................173 Jak dziaBa instrukcja use? 173 Importowanie przy u|yciu moduBu Exporter 174 Tablice @EXPORT i @EXPORT_OK 175 Tablica asocjacyjna %EXPORT_TAGS 176 6 | Spis tre[ci Eksportowanie w moduBach obiektowych 177 Niestandardowe procedury do obsBugi importowania 178 wiczenia 180 16. Tworzenie dystrybucji .................................................................................................181 Mo|na to zrobi na ró|ne sposoby 182 Korzystanie z programu h2xs 183 Dokumentacja zagnie|d|ona 189 Kontrolowanie dystrybucji przy u|yciu pliku Makefile.PL 192 Alternatywne lokalizacje instalacji (PREFIX=...) 193 Trywialna instrukcja make test 194 Trywialna instrukcja make install 195 Trywialna instrukcja make dist 195 Alternatywna lokalizacja biblioteki 196 wiczenie 197 17. Testy podstawowe ..................................................................................................... 199 Wicej testów oznacza lepszy kod 199 Prosty skrypt testowy 200 Sztuka testowania 201 Zrodowisko testowe 203 Pisanie testów przy u|yciu moduBu Test::More 204 Testowanie wBa[ciwo[ci obiektowych 206 Testowanie listy TODO 208 Pomijanie testów 209 Bardziej zBo|one testy (zbiory skryptów testowych) 209 wiczenie 210 18. Testy zaawansowane ..................................................................................................211 Testowanie dBugich BaDcuchów znaków 211 Testowanie plików 212 Testowanie urzdzeD STDOUT i STDERR 213 U|ywanie obiektów zastpczych 215 Testowanie dokumentacji POD 217 Testowanie pokrycia 218 Pisanie wBasnych moduBów Test::* 218 wiczenia 221 19. WkBad w CPAN ............................................................................................................223 Archiwum CPAN 223 Przygotowania 223 Przygotowywanie dystrybucji 224 Spis tre[ci | 7 Umieszczanie dystrybucji w archiwum 225 Przedstawianie moduBu226 Testowanie na wielu platformach 226 Zastanów si nad napisaniem artykuBu lub przeprowadzeniem wykBadu 226 wiczenie 227 A Rozwizania wiczeD .................................................................................................229 Skorowidz ...................................................................................................................255 8 | Spis tre[ci ROZDZIAA 3. U|ywanie moduBów ModuBy to cegieBki, z których mo|emy budowa programy. Udostpniaj one nadajce si do powtórnego wykorzystania procedury, zmienne, a nawet obiektowe klasy. Zanim nauczysz si tworzy wBasne moduBy, poka|emy Ci niektóre gotowe moduBy, które mog Ci zainteresowa. Poznasz tak|e podstawy stosowania moduBów napisanych przez innych programistów. Dystrybucja standardowa Perl zawiera wiele popularnych moduBów. W rzeczywisto[ci wikszo[ z ponad 50 megabajtów najnowszej dystrybucji to wBa[nie moduBy. W pazdzierniku 1996 roku Perl 5.003_07 zawieraB 98 moduBów. Obecnie, na pocztku 2006 roku, Perl 5.8.8 ma ich 3591. Jest to jedna z zalet jzyka Perl  udostpnia on wiele elementów pozwalajcych maBym nakBadem pracy tworzy u|y- teczne i zBo|one programy. W niniejszej ksi|ce postaramy si pokaza, które moduBy s dostpne wraz z jzykiem Perl (i, w wikszo[ci przypadków, od której wersji jzyka dostpny jest dany moduB). Bdziemy nazywa te moduBy  moduBami podstawowymi lub napiszemy, |e znajduj si one w  dys- trybucji standardowej . Je[li masz jzyk Perl, powiniene[ mie równie| te moduBy. Poniewa| przy pisaniu ksi|ki u|ywali[my wersji Perl 5.8.7, zakBadamy, |e jest to bie|ca wersja jzyka. Kiedy tworzysz wBasny kod, mo|esz zdecydowa si na u|ywanie jedynie moduBów pod- stawowych, dziki czemu bdziesz miaB pewno[, |e wszyscy u|ytkownicy Perla bd mieli te moduBy, o ile tylko u|ywaj przynajmniej tej samej wersji co Ty2. Nie chcemy wdawa si w tym miejscu w spory na ten temat, gBównie dlatego, |e zbytnio cenimy archiwum CPAN, aby si bez niego obej[. 1 Kiedy zapoznasz si z materiaBem tej ksi|ki, powiniene[ potrafi u|y moduBu Module::CoreList do samo- dzielnego sprawdzenia liczby moduBów. To wBa[nie w taki sposób okre[lili[my powy|sze liczby. 2 Cho nie bdziemy zgBbia tu tego zagadnienia, moduB Module::CoreList zawiera list opisujc, które moduBy dostpne s w danej wersji jzyka Perl, a tak|e inne dane historyczne. 29 U|ywanie moduBów Prawie ka|dy moduB jzyka Perl zawiera dokumentacj, a cho mo|emy nie wiedzie, jak dziaBaj mechanizmy danego moduBu, nie musimy si o to martwi, je[li wiemy, jak u|ywa jego interfejsu. W koDcu do tego wBa[nie sBu|y interfejs  pozwala ukry wszystkie szczegóBy. Na naszej lokalnej maszynie mo|emy wczyta dokumentacj moduBu, u|ywajc polecenia perldoc. Do polecenia nale|y przekaza nazw interesujcego nas moduBu, a program wy- [wietli jego dokumentacj. $ perldoc File::Basename NAME fileparse - split a pathname into pieces basename - extract just the filename from a path dirname - extract just the directory from a path SYNOPSIS use File::Basename; ($name,$path,$suffix) = fileparse($fullname,@suffixlist) fileparse_set_fstype($os_string); $basename = basename($fullname,@suffixlist); $dirname = dirname($fullname); DoBczyli[my pocztkowy fragment dokumentacji, aby pokaza najwa|niejsz sekcj (przy- najmniej na pocztku nauki). Dokumentacja moduBów zwykle jest zgodna ze starym formatem stron podrcznika man systemu Unix i rozpoczyna si od sekcji NAME oraz SYNOPSIS (zawie- rajcej streszczenie). Streszczenie przedstawia przykBady zastosowania moduBu, a je[li potrafisz oby si bez peBnego zrozumienia, mo|esz u|ywa danego moduBu. Oznacza to, |e mo|esz nie zna niektórych technik i skBadni jzyka Perl przedstawionych w streszczeniu, ale zwykle mo|esz po prostu posBu|y si przykBadem, a kod powinien dziaBa poprawnie. Poniewa| Perl to mieszanka proceduralnego, funkcyjnego, obiektowego i innych rodzajów jzyków programowania, moduBy jzyka Perl udostpniaj interfejsy ró|nego typu. Bdziemy u|ywa rozmaitych moduBów w nieco odmienny sposób, ale dopóty, dopóki mo|esz sprawdzi dziaBanie moduBu w dokumentacji, nie powiniene[ mie problemów. Interfejsy funkcyjne Do wczytywania moduBów posBu|ymy si wbudowan instrukcj use jzyka Perl. Na razie pominiemy szczegóBowy opis tej techniki. Wicej dowiesz si o niej z rozdziaBów 10. i 15. Na razie chcemy tylko u|y moduBu. Zacznijmy od File::Basename, u|ytego ju| moduBu z dystrybucji standardowej. Aby wczyta go do skryptu, nale|y wywoBa poni|sz instrukcj: use File::Basename; Kiedy to zrobimy, moduB File::Basename udostpni w skrypcie3 trzy procedury: fileparse, basename i dirname4. Od tego miejsca mo|emy u|ywa poni|szych instrukcji: 3 Tak naprawd procedury zostan zaimportowane do bie|cego pakietu, ale nie omawiali[my jeszcze tego zagadnienia. 4 A tak|e procedur narzdziow fileparse_set_fstype. 30 | RozdziaB 3. U|ywanie moduBów my $basename = basename( $some_full_path ); my $dirname = dirname( $some_full_path ); w taki sam sposób, jakby[my sami napisali procedury basename i dirname lub (prawie) jakby byBy one wbudowanymi funkcjami jzyka Perl. Te procedury pobieraj ze [cie|ki nazw pliku oraz nazw katalogu. Na przykBad, je[li zmienna $some_full_path ma warto[ D:\Projects\ IslandRescue\plan7.rtf (prawdopodobnie program zostaB uruchomiony w systemie Win- dows), warto[ci zmiennej $basename bdzie plan7.rtf, a warto[ci zmiennej $dirname  D:\Projects\IslandRescue. ModuB File::Basename potrafi okre[li, w jakim systemie dziaBa, dlatego jego funkcje popraw- nie przetwarzaj BaDcuchy znaków wedBug ró|nych ograniczników, jakie mog napotka. ZaBó|my jednak, |e w programie znajduje si ju| procedura dirname. Zostanie ona przesBonita definicj z moduBu File::Basename! Je[li wBczymy ostrze|enia, zobaczymy informujcy o tym komunikat. W przeciwnym razie Perl ignoruje tak sytuacj. Wybór importowanych elementów Na szcz[cie mo|emy ograniczy operacje wykonywane przez instrukcj use, podajc nazw moduBu oraz list nazw procedur. Ta lista to lista importu: use File::Basename ('fileparse', 'basename'); Teraz moduB wczyta jedynie dwie powy|sze procedury i pozostawi nasz procedur dirname bez zmian. Oczywi[cie taki zapis jest do[ dziwaczny, dlatego cz[ciej u|ywa si operatora cytowania: use File::Basename qw( fileparse basename ); Nawet je[li na li[cie znajduje si tylko jeden element, zwykle podaje si go na li[cie qw(), co zwiksza spójno[ i uBatwia pielgnacj. Czsto si zdarza, |e stwierdzamy:  potrzebujemy jeszcze jednej procedury z tego moduBu i wracamy do tej listy. Aatwiej jest doda now pro- cedur, je[li pierwsza znajduje si ju| na li[cie qw(). Ochronili[my lokaln procedur dirname, ale co zrobi, je[li potrzebujemy tak|e funkcjonalno[ci tej procedury z moduBu File::Basename? To proste. Wystarczy u|y jej, poprzedzajc j peBn nazw pakietu. my $dirname = File::Basename::dirname($some_path); Lista nazw znajdujca si po instrukcji use nie zmienia tego, jakie procedury s zdefiniowane w pakiecie moduBu (w tym przypadku jest to moduB File::Basename). Zawsze mo|emy u|y peBnej nazwy, niezale|nie od zawarto[ci listy importu, na przykBad5: my $basename = File::Basename::basename($some_path); Ekstremalnym (ale niezwykle u|ytecznym) rozwizaniem jest u|yciu pustej listy importu, tak jak w poni|szym kodzie: use File::Basename() # nie importuje niczego my $base = File::Basename::basename($some_path); 5 Nie musisz poprzedza wywoBaD tych procedur znakiem ampersandu, poniewa| od przetworzenia instrukcji use kompilator ju| je zna. Wybór importowanych elementów | 31 Pusta lista ró|ni si od braku listy. Pusta lista informuje:  nie nale|y importowa |adnych elementów , podczas gdy brak listy oznacza:  nale|y zaimportowa domy[lne elementy . Je[li autor moduBu napisaB go poprawnie, domy[lne elementy to te, których potrzebujemy. Interfejsy obiektowe Porównajmy importowanie procedur z moduBu File::Basename z dziaBaniem innego moduBu podstawowego, File::Spec. ModuB File::Spec sBu|y do obsBugi operacji zwykle wykony- wanych na identyfikatorze pliku. Identyfikator pliku to zwykle nazwa pliku lub katalogu, ale mo|e to by tak|e nazwa nieistniejcego pliku  w takim przypadku nie jest to tak naprawd nazwa pliku, prawda? W przeciwieDstwie do moduBu File::Basename moduB File::Spec ma interfejs obiektowy. Wczytujemy ten moduB przy u|yciu instrukcji use, tak samo jak wcze[niej. use File::Spec; Jednak, poniewa| interfejs tego moduBu jest obiektowy6, powy|sza instrukcja nie importuje |adnych procedur. W zamian interfejs pozwala na dostp do funkcjonalno[ci moduBu poprzez metody klasy. Metoda catfile zBcza list BaDcuchów znaków, u|ywajc odpowiedniego separatora katalogów: my $filespec = File::Spec->catfile( $homedir{gilligan}, 'web_docs', 'photos', 'USS_Minnow.gif' ); Powy|szy kod wywoBuje metod statycznej catfile klasy File::Spec. Ta metoda tworzy [cie|k odpowiedni dla danego systemu operacyjnego i zwraca jeden BaDcuch znaków7. Ze wzgldu na skBadni powy|szy zapis jest podobny do ponad dwudziestu innych operacji udostpnianych przez moduB File::Spec. ModuB File::Spec udostpnia kilka innych metod pozwalajcych na obsBug [cie|ek plików w sposób przeno[ny. Wicej o zagadnieniach zwizanych z przeno[no[ci kodu dowiesz si z dokumentacji perlport. Bardziej typowy moduB obiektowy  Math::BigInt Aby[ si nie rozczarowaB nieobiektowym wygldem moduBu File::Spec, który nie ma obiek- tów, przyjrzyjmy si nastpnemu moduBowi podstawowemu, Math::BigInt, który sBu|y do obsBugi liczb caBkowitych przekraczajcych wbudowane mo|liwo[ci jzyka Perl8. use Math::BigInt; my $value = Math::BigInt->new(2); # rozpoczynamy od 2 $value->bpow(1000); # przyjmuje warto[ 2**1000 print $value->bstr( ), "\n"; # wy[wietla wynik 6 Je[li potrzebny jest interfejs funkcyjny, mo|na u|y instrukcji File::Spec::Functions. 7 W systemie Unix tym BaDcuchem znaków mo|e by na przykBad /home/gilligan/web_docs/USS_Minnow.gif. W systemie Windows separatorami katalogów s zwykle lewe uko[niki. Ten moduB pozwala w Batwy sposób napisa przeno[ny kod (przynajmniej ze wzgldu na specyfikacje plików). 8 Na zapleczu jzyk Perl jest ograniczony architektur, w której dziaBa. Jest to jedno z niewielu miejsc, gdzie trzeba zwraca uwag na sprzt. 32 | RozdziaB 3. U|ywanie moduBów Tak|e ten moduB nie wymaga importowania |adnych jednostek. CaBy jego interfejs skBada si z metod statycznych, takich jak metoda new, któr nale|y wywoBywa wraz z nazw klasy, aby utworzy jej egzemplarz. Nastpnie mo|na wywoBywa przy u|yciu tych egzemplarzy metody egzemplarza, takie jak bpow czy bstr. Archiwum CPAN Archiwum CPAN (ang. Comprehensive Perl Archive Network) to wynik wspólnej pracy wielu wolontariuszy. Wielu z nich pocztkowo prowadziBo wBasne maBe (lub du|e) witryny FTP o jzyku Perl, jeszcze zanim narodziB si internet. Pod koniec 1993 roku zjednoczyli oni swe wysiBki dziki li[cie dyskusyjnej perl-packrats i zdecydowali, |e przestrzeD dyskowa staBa si na tyle tania, |e mo|na powieli te same informacje na wszystkich witrynach, zamiast d|y do specjalizacji ka|dej z nich. Ten pomysB dojrzewaB przez rok, a| w koDcu Jarkko Hietaniemi utworzyB fiDsk witryn FTP jako zródBo, z którego wszystkie serwery  lustrzane mog pobiera codzienne lub nawet cogodzinne aktualizacje. Cz[ pracy nad tym projektem wymagaBa ponownego uporzdkowania i zorganizowania odrbnych archiwów. ZostaBy utworzone miejsca dla binariów jzyka Perl przeznaczonych dla architektur niebazujcych na systemie Unix, dla skryptów oraz dla samego kodu zródBowego w jzyku Perl. Jednak najwikszym i najciekawszym elementem archiwum CPAN s moduBy. ModuBy w archiwum CPAN s zorganizowane w drzewo dowizaD symbolicznych wedBug hierarchicznych, funkcjonalnych kategorii. Odno[niki wskazuj na katalog autora, w którym to katalogu znajduj si potrzebne pliki. Obszar zawierajcy moduBy zawiera tak|e indeksy majce zwykle format Batwy do przetworzenia przy u|yciu jzyka Perl, na przykBad dane wyj[ciowe z moduBu Data::Dumper w przypadku szczegóBowego indeksu moduBów. Oczywi[cie wszystkie te indeksy s automatycznie generowane na podstawie baz danych gBównego serwera, do czego sBu| inne programy w jzyku Perl. Czsto odzwierciedlanie archiwum CPAN z jed- nego serwera na inny odbywa si przy u|yciu wiekowego ju| programu mirror.pl, napisa- nego w jzyku Perl. Od skromnych pocztków w postaci kilku serwerów  lustrzanych archiwum CPAN rozro- sBo si do ponad 200 publicznych archiwów dostpnych we wszystkich zaktkach internetu. Wszystkie serwery s archiwizowane i aktualizowane przynajmniej raz dzienie, a niektóre nawet co godzin. Niezale|nie od tego, w którym miejscu [wiata jeste[, znajdziesz w pobli|u serwer CPAN, z którego mo|esz pobra najnowsze zasoby. Niezwykle u|yteczna strona CPAN Search (http://search.cpan.org) stanie si prawdopodobnie Twoim ulubionym interfejsem. Dziki tej witrynie mo|esz wyszukiwa moduBy, sprawdza ich dokumentacj, przeglda dystrybucje i kontrolowa raporty testerów CPAN i wykonywa wiele innych operacji. Instalowanie moduBów z archiwum CPAN Zainstalowanie prostego moduBu z CPAN nie powinno sprawia trudno[ci  wystarczy pobra archiwum z dystrybucj moduBu, rozpakowa je i umie[ci moduB w odpowiednim katalogu. W poni|szym kodzie u|ywamy instrukcji wget, ale mo|esz u|ywa tak|e innych narzdzi. Instalowanie moduBów z archiwum CPAN | 33 $ wget http://www.cpan.org/.../HTTP-Cookies-Safari-1.10.tar.gz $ tar -xzf HTTP-Cookies-Safari-1.10.tar.gz $ cd HTTP-Cookies-Safari-1.10s Nastpnie mo|esz wybra jedno z dwóch rozwizaD (opisujemy je szczegóBowo w rozdziale 16.). Je[li znajdziesz plik o nazwie Makefile.PL, mo|esz uruchomi poni|sz sekwencj poleceD w celu skompilowania, przetestowania i zainstalowania kodu zródBowego: $ perl Makefile.PL $ make $ make test $ make install Je[li nie masz uprawnieD do instalowania moduBów w katalogach globalnych9, mo|esz nakaza zainstalowanie ich w innej [cie|ce, u|ywajc argumentu PREFIX: $ perl Makefile.PL PREFIX=/Users/home/Ginger Aby Perl szukaB moduBów w tym katalogu, mo|esz ustawi zmienn [rodowiskow PERL5LIB. Perl doda wtedy okre[lone katalogi do listy katalogów, w których wyszukuje moduBów. $ export PERL5LIB=/Users/home/Ginger Mo|esz tak|e u|y dyrektywy lib, aby doda katalog do [cie|ki wyszukiwania moduBów, jednak to rozwizanie nie jest równie wygodne, poniewa| wymaga wprowadzania zmian w kodzie. Ponadto na innych komputerach, na których mo|esz chcie uruchomi dany kod, potrzebny moduB mo|e znajdowa si w innym katalogu. #!/usr/bin/perl use lib qw(/Users/home/Ginger); Cofnijmy si nieco. Je[li znajdziesz plik Build.PL zamiast pliku Makefile.PL, powiniene[ wykona te same operacje. W przypadku dystrybucji udostpnianych z tym pierwszym plikiem nale|y u|ywa moduBu Module::Build do kompilowania i instalowania kodu. Poniewa| moduB Module::Build nie jest moduBem podstawowym jzyka Perl10, musisz go zainstalowa, zanim bdziesz mógB zainstalowa potrzebn dystrybucj. $ perl Build.PL $ perl Build $ perl Build test $ perl Build install Aby zainstalowa moduB w prywatnym katalogu przy u|yciu moduBu Module::Build, nale|y doda parametr --install_base. Informowanie interpretera Perl o tym, gdzie znajduj si moduBy, odbywa si w taki sam sposób jak poprzednio. $ perl Build.PL --install_base /Users/home/Ginger Czasem w dystrybucji znajduj si oba pliki  Makefile.PL i Build.PL. Co nale|y wtedy zrobi? Mo|na u|y dowolnego z nich. Mo|esz wybra ten, który lepiej znasz. 9 Te katalogi ustawia administrator w czasie instalowania jzyka Perl. Mo|na je wy[wietli, u|ywajc instrukcji perl -V. 10 Przynajmniej na razie. Planowane jest doBczenie go do moduBów podstawowych od wersji 5.10 jzyka Perl. 34 | RozdziaB 3. U|ywanie moduBów Ustawianie [cie|ki w odpowiednim momencie Perl wyszukuje moduBy, przeszukujc katalogi znajdujce si w specjalnej tablicy jzyka Perl, @INC. Instrukcja use jest wykonywana na etapie kompilacji, dlatego sprawdzanie [cie|ki prowa- dzc do moduBu, @INC, równie| ma miejsce na etapie kompilacji. Mo|e to spowodowa nie- poprawne dziaBanie programu, które trudno zrozumie, o ile nie wezmie si pod uwag zawar- to[ci tablicy @INC. Na przykBad, zaBó|my, |e masz wBasny katalog /home/gilligan/lib i umie[ciBe[ wBasny moduB Navigation::SeatOfPants w pliku /home/gilligan/lib/Navigation/SeatOfPants.pm. Kiedy spróbujesz wczyta ten moduB, Perl nie bdzie potrafiB go znalez. use Navigation::SeatOfPants Perl wy[wietli informacj, |e nie mo|e znalez moduBu w tablicy @INC, a nastpnie wy[wietli wszystkie znajdujce si w niej katalogi. Can't locate Navigation/SeatOfPants.pm in @INC (@INC contains: & ) Mo|esz wpa[ na rozwizanie polegajce na dodaniu katalogu zawierajcego moduB do tablicy @INC przed wywoBaniem instrukcji use. Jednak nawet po dodaniu tej instrukcji: unshift @INC, '/home/gilligan/lib'; # nie dziaBa use Navigation::SeatOfPants; kod nie zadziaBa. Dlaczego? Poniewa| metoda unshift jest wywoBywana w czasie wykonywania programu, dBugo po próbie wywoBania instrukcji use majcej miejsce na etapie kompilacji. Te dwie instrukcje s blisko siebie w przestrzeni, ale nie w czasie. To, |e napisaBe[ je jedna po drugiej, nie oznacza jeszcze, i| zostan wykonane w takiej kolejno[ci. Chcesz zmieni zawar- to[ tablicy @INC przed wywoBaniem instrukcji use. Jednym z rozwizaD jest dodanie bloku BEGIN wokóB instrukcji push: BEGIN { unshift @INC, '/home/gilligan/lib'; } use Navigation::SeatOfPants; Teraz blok BEGIN zostanie skompilowany i wykonany w czasie kompilacji, dziki czemu ustawi odpowiedni [cie|k dla instrukcji use. Jednak to rozwizanie jest nieeleganckie i mo|e wymaga o wiele wicej wyja[nieD, ni| jeste[ skBonny przedstawi, szczególnie gdy odbiorc jest programista, który w pózniejszym czasie ma dba o kod. Mo|esz zastpi caBy powy|szy baBagan prost dyrektyw, której u|ywaBe[ ju| wcze[niej: use lib '/home/gilligan/lib'; use Navigation::SeatOfPants; W powy|szym rozwizaniu dyrektywa lib przyjmuje jeden lub wicej argumentów i dodaje je na pocztek tablicy @INC, podobnie jak robi to instrukcja unshift11. To rozwizanie dziaBa, poniewa| jest wykonywane na etapie kompilacji, a nie w czasie wykonywania programu. Dlatego wszystko jest gotowe do wykonania instrukcji use wystpujcej bezpo[rednio poni|ej. Poniewa| dyrektywa use lib prawie zawsze u|ywa [cie|ki zale|nej od systemu, jest to roz- wizanie tradycyjne i zalecamy umieszczanie tej instrukcji na pocztku pliku. Dziki temu mo|na j Batwiej znalez i poprawi, kiedy chcesz przenie[ plik do nowego systemu lub zmieni 11 Instrukcja use lib ponadto dodaje zale|n od architektury bibliotek za |dan bibliotek, przez co jest to bardziej warto[ciowe rozwizanie ni| przedstawiony wcze[niej odpowiednik. Ustawianie [cie|ki w odpowiednim momencie | 35 nazw katalogu zawierajcego lib. Oczywi[cie mo|esz caBkowicie wyeliminowa instrukcj use lib, je[li zainstalujesz moduB w standardowej lokalizacji opisanej w tablicy @INC, ale nie zawsze jest to wygodne. Instrukcja use lib nie znaczy  u|yj danej biblioteki , ale raczej  u|yj danej [cie|ki do znale- zienia bibliotek (i moduBów) . Zbyt czsto spotykamy si z kodem podobnym do poni|szego: use lib '/home/gilligan/lib/Navigation/SeatOfPants.pm'; # yLE Nastpnie programista zastanawia si, dlaczego instrukcja nie dodaBa definicji. Pamitaj, |e instrukcja use lib jest wykonywana na etapie kompilacji, dlatego poni|sze rozwizanie tak|e nie jest poprawne: my $LIB_DIR = '/home/gilligan/lib'; & use lib $LIB_DIR; # BAD use Navigation::SeatOfPants; Oczywi[cie jzyk Perl przetwarza deklaracj zmiennej $LIB_DIR na etapie kompilacji (dlatego nie pojawi si bBd, je[li u|yjesz instrukcji use strict, natomiast próba wywoBania use lib powinna zakoDczy si niepowodzeniem), ale rzeczywiste przypisanie warto[ci /home/gilligan/ lib/ ma miejsce dopiero w czasie wykonywania programu. Niestety, tak|e w tym przypadku jest to zbyt pózno. Dlatego trzeba umie[ci instrukcje w bloku BEGIN lub zdecydowa si na inn operacj wy- konywan na etapie kompilacji  na ustawienie warto[ci staBej przy u|yciu instrukcji use constant: use constant LIB_DIR => '/home/gilligan/lib'; & use lib LIB_DIR; use Navigation::SeatOfPants; Gotowe. Ponownie dziaBa, przynajmniej dopóty, dopóki okre[lenie biblioteki nie zale|y od wyników jakich[ obliczeD. (Kiedy to si skoDczy? Niech kto[ przerwie to szaleDstwo!) To roz- wizanie powinno dziaBa poprawnie w okoBo 99 procentach przypadków. ObsBuga zale|no[ci moduBu WidziaBe[ ju|, |e je[li spróbujesz zainstalowa dany moduB przy u|yciu Module::Build, musisz najpierw zainstalowa sam moduB Module::Build. Jest to stosunkowo Bagodny przykBad bardziej ogólnego problemu z zale|no[ciami, którego nie rozwi| wszystkie kokosy na wyspie roz- bitków. Mo|e zaj[ potrzeba zainstalowania kilku innych moduBów, które same wymagaj nastpnych moduBów. Na szcz[cie dostpne s odpowiednie narzdzia. ModuB CPAN.pm jest cz[ci dystrybucji standardowej od wersji Perl 5.004. Ten moduB udostpnia interaktywn powBok sBu|c do instalowania moduBów. $ perl -MCPAN -e shell cpan shell -- CPAN exploration and module installation (v1.7601) ReadLine support available (try 'install Bundle::CPAN') cpan> Aby zainstalowa moduB oraz jego zale|no[ci, nale|y wywoBa instrukcj install i poda nazw moduBu. Wtedy moduB CPAN.pm obsBu|y wszystkie zadania: pobranie, rozpakowanie, 36 | RozdziaB 3. U|ywanie moduBów skompilowanie, przetestowanie i zainstalowanie moduBu, wykonujc te operacje rekurencyjnie dla wszystkich zale|no[ci. cpan> install CGI::Prototype Wymaga to nieco zbyt wiele pracy, dlatego brian utworzyB skrypt cpan, który tak|e jest do- stpny w Perlu. Wystarczy poda list moduBów, które chcesz zainstalowa, a skrypt wykona wszystkie potrzebne operacje. $ cpan CGI::Prototype HTTP::Cookies::Safari Test::Pod Nastpne narzdzie, CPANPLUS, to zupeBnie nowa wersja moduBu CPAN.pm, która jednak na razie nie wchodzi w skBad dystrybucji standardowej. $ perl -MCPANPLUS -e shell CPANPLUS::Shell::Default -- CPAN exploration and modules installation (v0.03) *** Please report bugs to <cpanplus-bugs@lists.sourceforge.net>. *** Using CPANPLUS::Backend v0.049. *** ReadLine support available <try 'i Term::ReadLine::Perl'). CPAN Terminal> Aby zainstalowa wybrany moduB, nale|y u|y polecenia i. CPAN Terminal> i CGI::Prototype ModuB CPANPLUS tak|e zwizany jest ze skryptem, który uBatwia jego u|ywanie. Nazwa tego skryptu to cpanp. Je[li przeka|esz do skryptu opcj i oraz list moduBów, skrypt zainstaluje je, podobnie jak instrukcja przedstawiona powy|ej. $ cpanp i CGI::Prototype HTTP::Cookies::Safari Test::Pod wiczenia Rozwizania poni|szych wiczeD znajdziesz w punkcie  Rozwizania wiczeD z rozdziaBu 3. , w dodatku A. wiczenie 1. (25 minut) Wczytaj list plików znajdujcych si w bie|cym katalogu i przeksztaB ich nazwy na iden- tyfikatory peBnej [cie|ki. Do pobrania bie|cego katalogu nie u|ywaj powBoki ani |adnego zewntrznego programu. Wystarcz do tego moduBy File::Spec oraz Cwd, oba dostpne w jzyku Perl. Wy[wietl ka|d [cie|k, dodajc cztery odstpy z jej przodu oraz znak nowego wiersza na koDcu, podobnie jak zrobiBe[ to w pierwszym wiczeniu w rozdziale 2. Czy potrafisz powtórnie wykorzysta fragment tamtego rozwizania do wykonania tego zadania? wiczenie 2. (35 minut) Przetwórz numer ISBN znajdujcy si z tyBu tej ksi|ki (8324606157). Zainstaluj moduB Busi- ness::CPAN z archiwum CPAN i u|yj go do pobrania z tego numeru kodu kraju oraz kodu wydawcy. wiczenia | 37

Wyszukiwarka

Podobne podstrony:
Iwasiów I Gender dla średnio zaawansowanych
Budowa robotow dla srednio zaawansowanych Wydanie II budros

więcej podobnych podstron