|
|
 | | From: | Krzysztof Juszkiewicz | | Subject: | FAQ pl.comp.lang.perl FAQ cz. 1 (290) | | Date: | 06 Jan 2005 03:00:01 CET |
|
|
 | URL: http://www.kt.agh.edu.pl/other/perl/faq/ Last-Modified: Fri Jun 4 10:10:53 2004 Archive-name: pl/comp/lang/perl-faq/1 Part: 1 Posting-Frequency: monthly (6th)
1. FAQ grupy pl.comp.lang.perl Data modyfikacji: 4 czerwca 2004
To sa najczesciej zadawane pytania i odpowiedzi na grupie pl.comp.lang.perl.
Odpowiedzi nie sa pisane wylacznie przez autora, lecz dyskutantow grupy. Poczatkujacy powinien nauczyc sie przynajmniej podstaw perla (kursy, ksiazki - adresy ponizej), a potem siegac do FAQ lub pytac na grupie, stosujac zasady dotyczace grupy (patrz nizej).
Chcialbym podziekowac, tym ktorzy wniesli wklad w to faq. W szczegolnosci czytelnikom grupy news:pl.comp.lang.perl zadajacym pytania i odpowiadajacym, sa to w szczegolnosci:
Piotr Piatkowski Marcin Jagodzinski Hubert depesz Lubaczewski Szymon Sokol Lukasz Rewerenda Wawrzyniec Zurowski Pawel Olszewski Piotr Auksztulewicz Tomasz Blachowicz Radoslaw Zielinski Krzysztof Koczyjan Slawomir Szczyrba Daniel Podlejski Andrzej Filip Krzysztof Krzyzaniak Wojciech Gazda Dariusz Sznajder Tomasz Miklas Bernard El-Hagin Marcin Kaszynski Janusz Harkot
Z gory chcialbym podziekowac wszystkim, ktorzy zauwaza ciekawostki o perlu w Polsce lub po polsku i przysla na adres juszkiew@kt.agh.edu.pl
FAQ moze byc mirrorowane na WWW w niezmienionej formie z zaznaczeniem orginalnego pochodzenia. Przy utrzymywaniu okresowej aktualizacji autor FAQ umieszcza adres mirrora w FAQ.
1.1. Co sie w FAQ zmienilo od ostatniej wersji? 2.9. Gdzie sa strony zagraniczne? 12. Wyrazenia tekstowe 4.10. Czego uzyc do zaawansowanych sciagan? 12.10. Czym innym parsowac HTML? 3.7. W czym pisac skrypty? 4.10. Czego uzyc do zaawansowanych sciagan? 4.11. Czy sa biblioteki do FTP? 4.23. Co to jest mod_perl? 12.9. Jak zamienic encje HTML? 3.15. Jak zostawic dzialajacy skrypt (w tle)? 9.4. A co z Excelem (CSV - plik srednikowy/przecinkowy)? 3.16. Jak pokazac, ze skrypt dziala (wiatraczek)? 9.7. Czym parsowac XML/SGML? 8.20. Jak zrobic PDF? 13.22. A jak go zrobic? 2.1. Jakie sa ksiazki po polsku? 7.4. Jak poprawic polskie znaki? 13.13. Jak wczytac jeden klawisz? 8.21. Jak obsluzyc plik po kompresji? 3.5. Jak uruchomic z prawami roota? 9.5. A z Accessem? 13.8. Jak pomieszac tablice (losowo)? 12.7. Jak wyciagnac tekst z pliku HTML? 2.4. Jak dostac odpowiedz na newsach? 3.8. Jak testowac skrypty?
1.2. Gdzie jest FAQ w najnowszej wersji? Przede wszystkim na grupie news:pl.comp.lang.perl oraz news:pl.answers a takze:
http://www.kt.agh.edu.pl/other/perl/faq/ (wersja HTML) http://www.kt.agh.edu.pl/other/perl/faq/faq.pl.txt (wersja tekstowa) http://www.kt.agh.edu.pl/other/perl/faq/faq.txt (wersja bez ogonkow) http://www.kt.agh.edu.pl/other/perl/faq/faq.ps (wersja Postscript) http://republika.pl/perlfaq/ (wersja HTML) http://www.plh.pl/perl/faq/ (wersja HTML) http://www.plh.pl/perl/faq/faq.pl.txt (wersja tekstowa) http://www.plh.pl/perl/faq/faq.txt (wersja bez ogonkow) http://www.plh.pl/perl/faq/faq.ps (wersja postscript) wersje starsze:
http://www.programming.pl/manuals/perl-faq/ (HTML) http://www.lonet.gdynia.pl/~busik/htm_test/perl/ (HTML) http://4programmers.net/cgi/perl_faq.html (tekst) http://ejo.univ-lyon1.fr/faq/by-newsgroup/pl/pl.comp.lang.perl/ oraz w archiwach grup.
2. Wiedza 2.1. Jakie sa ksiazki po polsku? Roznych aspektow Perla mozna sie uczyc z ksiazek (kolejnosc wydawania):
Tom Christiansen, Nathan Torkington (Mateusz Michalski, Rafal Szpoton, Slawomir Dzieniszewski) "Perl. Receptury. Wydanie II", wyd. Helion 2004 ISBN: 83-7361-328-5 ok. 100 zl Dla: srednich i zaawansowanych Allison Randal, Dan Sugalski, Leopold Totsch (Rafal Szpoton) "Perl 6. Podstawy", wyd. Helion 2003, ISBN: 83-7361-299-8 ok. 30 zl Ksiazka "do poduszki" o przyszlej wersji jezyka Perl Reuven M. Lerner (M. Michalski, S. Dzieniszewski) "Perl. core", wyd. Helion 2003, ISBN: 83-7361-169-X ok. 50 zl Dla: srednich Jon Orwant, Jarkko Hietaniemi, John Macdonald (Slawomir Dzieniszewski, Marcin Jedrysiak) "Algorytmy w Perlu", wyd. Helion 2003, ISBN: 83-7197-913-4 ok. 70 zl Dla: zaawansowanych Opis typowych typowych problemow i ich rozwiazan w jezyku Perl Sriram Srinivasan (Adam Podstawczynski) "Perl. Zaawansowane programowanie", wyd. Helion 2003, ISBN: 83-7197-999-1 ok. 60 zl Dla: zaawansowanych Zlozone struktury danych, obiektowosc, moduly, sieci, grafika, rozbudowa. Geoffrey Young, Paul Lindner, Randy Kobes (Przemyslaw Kowalczyk) "mod_perl. Podrecznik programisty", wyd. Helion 2003, ISBN: 83-7197-799-9 Dla: zaawansowanych Wbudowany modul Perla do serwera WWW Apache Krzysztof Juszkiewicz "Perl. Cwiczenia", wyd. Helion 2003, ISBN: 83-7197-946-0 ok. 16 zl Dla: poczatkujacych Ksiazka szczegolnie dla tych, ktorzy ucza sie na przykladach. Simon Cozens (Rafal Bielec, Adam Osuchowski, Rafal Szpoton) "Perl. Od podstaw", wyd. Helion 2003, ISBN: 83-7197-496-5 ok. 70 zl Dla: poczatkujacych Podstawy, moduly, obiekty, CGI, bazy danych, siec R. Allen Wyke, Donald B. Thomas (Lukasz Cygan) "Perl. Kurs podstawowy", wyd. Edition 2000 2002, ISBN: 83-7366-006-2 ok. 45 zl Dla: poczatkujacych Same poczatki, zgodnie z tytulem. Troche o DBI i CGI. Lincoln D. Stein (Robert Gebarowski) "Perl. Tworzenie aplikacji sieciowych", wyd. Helion 2002, ISBN: 83-7197-604-6 ok. 90 zl Dla: srednich Architektura serwer-klient dla wielu protokolow TCP, UDP, SMTP, POP, IMAP, NNTP, FTP, HTTP wraz z ich omowieniem. Watki. John Callender (Wojciech Derechowski) "Perl w zarzadzaniu witrynami WWW", wyd. Helion 2002, ISBN: 83-7197-676-3 ok. 50 zl Dla: srednich Kierunki tworzenia i utrzymania informacji WWW Steven Holzner (Tomasz Zmijewski) "Perl. Czarna ksiega", wyd. Helion 2001, ISBN: 83-7197-288-1 ok. 45 zl Dla: wszystkich (szczegolnie poczatkujacych) Kompendium wiedzy o Perlu z wieloma przykladami i najpopularniejszymi zastosowaniami. Stephen Lidie (Robert Gebarowski) "Perl/Tk. Leksykon kieszonkowy", wyd. Helion 2001, ISBN: 83-7197-464-7 ok. 10 zl Dla: srednich i zaawansowanych Graficzne interfejsy Tk w Perlu w formie kompendium, z drobnymi bledami tlumacza Andrew Ford (Robert Gebarowski) "mod_perl. Leksykon kieszonkowy", wyd. Helion 2001, ISBN: 83-7197-468-X, ok. 10 zl Dla: srednich i zaawansowanych Przewodnik po mod_perl w wersji 1.24, z krotkim kursem wprowadzajacym z metodami adaptacji skryptow CGI oraz aplikacjami na module. Jeffrey E. F. Friedl (Adam Podstawczynski) "Wyrazenia regularne", wyd. Helion 2001, (Mastering Regular Expressions) ISBN: 83-7197-351-9 ok. 40 zl Dla: srednich Opis wyrazen regularnych dla roznych srodowisk, w tym takze perla. Johan Vromans (Aleksander Paleczny): "Perl 5 - Leksykon kieszonkowy", wyd. Helion 2001 ISBN: 83-7197-365-9 ok. 9 zl Dla: srednich Kieszonkowe wydanie streszczenia perla z odniesieniami do funkcji, operatorow, zmiennych, a nawet modulow. Larry Wall, Tom Christiansen, Jon Orwant (Marcin Moskwa,Janusz Machowski, Rafal Malkowski, Piotr Kresak): "Perl - programowanie. Wyd.2" ("Programming Perl, Third Edition"), wyd. RM 2001 ISBN: 83-7243-123-X ok. 130/70 zl Dla: srednich "Camel Book" czyli "Biblia Perla" lub "Wielblad", napisana przez tworcow tego jezyka podstawowa ksiazka, wyjasniajaca tajniki programowania w Perlu. Zawiera manuale i sugestie, ktora funkcja jest szybsza. Clinton Pierce (Tomasz Rabij) "Poznaj Perl w 24 godziny", wyd. Intersoftland 2000 ISBN: 83-7260-016-3 ok. 60 zl Dla: poczatkujacych Zawiera podstawy i opis CGI. David N. Blank-Edelman (Piotr Kresak): "Perl dla administratorow systemow", wyd. RM 2000 ISBN: 83-7243-122-1, ok. 65/40 zl Dla: srednich i zaawansowanych Opisy uslug, systemu UNIX, SQLa do perla. Skrypty dla roznych platform do zarzadzania, monitorowania i statystyk. Randal L. Schwartz, Tom Christiansen (Michal Jeczalik, Marcin Jagodzinski): "Perl. Wprowadzenie", wyd. Helion 2000 ISBN: 83-7197-220-2, ok. 35 zl Pozycja, jak sama nazwa wskazuje wprowadza do Perla. Nie jest przeladowana przykladami. Na uwage zasluguje rozdzial 19 dotyczacy CGI: http://www.helion.com.pl/online/perlwp/perlwp19.pdf Ksiazka zawiera cwiczenia, nie ma natomiast opisu, przydatnego poczatkujacym, debugera. Laura Lemay (Janusz Grabis): "Perl dla kazdego", wyd. Helion 2000, ISBN 83-7197-053-6, ok. 63 zl Zawiera rozdzial o CGI, a takze po kazdym rozdziale pytania z odpowiedziami. Alligator Descartes, Tim Bunce (Adam Podstawczynski): ISBN: 83-7243-090-X, ok. 30 zl Dla: srednich i lepszych Mozna sie dowiedziec o budowie baz danych (od tych najprostszych csv az po relacyjne), o skladni SQL, o budowie interfejsu DBI wraz z przejrzystymi przykladami obejmujacymi kazde zagadnienie, o obsludze z poziomu DBI sterownikow roznych baz, nieco o DBD::ODBC i Win32::ODBC, a wszystko -- oczywiscie -- z punktu widzenia Perla dla poczatkujacych i ekspertow. Scott Guelich, Shishir Gundavaram, Gunther Birznieks (Krzysztof Gestwa): "Programowanie CGI w Perlu", wyd. RM 2000, ISBN: 83-7243-117-5, ok. 63 zl Dla: srednich Opis modulu CGI i innych zagadnien WWW. Larry Wall, Tom Christiansen, Randal L. Schwartz, Stephen Potter (Marzena Baranowska, Marcin Moskwa, Rafal Sztencel, Piotr Teczynski): "Programowanie Perl" ("Programming Perl, Second Edition"), wyd. RM 1999, ISBN 83-87216-30-5, ok. 80 zl Tom Christiansen, Nathan Torkington (Krzysztof Labanowski, Marcin Moskwa, Zbigniew Szalbot): "Perl receptury" ("Perl Cookbook"), wyd. RM 1999, ISBN 83-87216-96-8, ok. 75 zl: Dla: srednich i lepszych Ksiazka ta pokazuje rozne rozwiazania problemow, przed jakimi staje osoba programujaca w perlu. Jest jednoczesnie pelnym przegladem tego jezyka: na przykladach mozemy nauczyc sie zarowno podstaw Perla (choc podobno nie od zera), jak i zaglebic sie w bardziej zaawansowane zagadnienia. Uzywa wspolczesnego modulowatego Perla5. Dobrze opisany i skomentowany kod. Sensowne zastosowania i przyklady. Craig Patchett, Matthew Wright (Michal Mosiewicz, Jerzy Hodor): "CGI/Perl - ksiazka kucharska" ("CGI/Perl Cookbook"), wyd. Helion 1999, ISBN 837197-061-7, ok. 65 zl Dla: srednich Przydatne programy CGI wydrukowane i prawie linia po linii komentowane - swietna metoda nauki na przykladach z CD-ROMem. Niestety sa one napisane w bardzo archaicznym Perlu z nieistniejacymi bibliotekami, nie korzystajac wcale z modulu CGI. Elizabeth Castro (Piotr Nowakowski): "PERL i CGI, nauka pisania skryptow", wyd. Mikom 1999, ISBN 83-7158-194-7, ok. 28 zl Dla: poczatkujacych Ksiazka z przykladami do pobrania spod http://www.peachpit.com/vqs/perlcgi Rafe Colburn (Michal Mosiewicz): "CGI", wyd. Helion 1998 ISBN 83-7197-032-3, ok. 30 zl Ksiazka podobno wciaga, ma jednak bledy skladniowe. Jerry Muelver (Bogdan Kaminski): "Perl - Tworzenie stron WWW", wyd. RM 1998, ISBN: 83-87216-35-6 ok. 43 zl Dla: srednich i lepszych Wydanie ma sporo bledow, posiada CD-ROM Przyklady programow z powyzszych ksiazek mozna odnalezc:
ftp://ftp.ora.com/published/oreilly/perl/ ftp://ftp.oreilly.com/published/oreilly/nutshell/ Niektore tresci ksiazek w wersji angielskiej sa rowniez w sieci.
2.2. Co to jest CPAN? Glownym zrodlem dokumentacji jest CPAN (Comprehensive Perl Archive Network). W CPANie znalezc mozna: samego Perla (interpreter, zrodla, wersje skompilowane), dokumentacje, przykladowe skrypty, moduly (biblioteki). Oficjalne adresy:
ftp://ftp.man.szczecin.pl/pub/perl/CPAN/ ftp://ftp.man.torun.pl/pub/doc/CPAN/ ftp://ftp.pk.edu.pl/pub/lang/perl/CPAN/ ftp://sunsite.icm.edu.pl/pub/CPAN/ ftp://ftp.mega.net.pl/pub/mirrors/ftp.perl.com/ Do sciagania modulow sluzy modul CPAN (patrz tez instalacja modulow):
perl -MCPAN -e shell 2.3. Gdzie znajde najblizsza dokumentacje? Na komputerze gdzie Perl jest zainstalowany, powinny byc dostepne manuale, ktorych wykaz uzyskuje sie wydajac komende man perl. Uzytecznym poleceniem jest takze (zastepujacym polecenie man) perldoc (konieczny w Linuxie moze byc pakiet perl-pod) w nastepujacej konfiguracji:
perldoc CGI - informacja o module CGI perldoc -f print - informacja o funkcji print perldoc -q debug - informacja z FAQ na temat znajdowania bledow (debug) w Perlu perldoc perlre - manual o wyrazeniach regularnych Dostep do FAQ po wydaniu komendy perldoc perlfaq.
W niektorych systemach (windows) komende perldoc zastepuje zestaw perl perldoc. A manuale sa w formacie HTML np.:
file:///C:/Perl/html/faq/Windows W innym systemie (Linux) manuale sa w jezyku polskim, dostepne takze przez WWW:
http://ptm.linux.pl/man_HTML/man1/perl.1.html http://www.linux.net.pl/ptm/man_HTML/man1/perl.1.html http://siodemka.p.lodz.pl/~pkopczy/manual/perl.1.html http://student.wsp.krakow.pl/~tech12/man1/p/perl.1.html A po angielsku:
http://www.perldoc.com/ 2.4. Jak dostac odpowiedz na newsach? Boli mnie watroba. Czym sie leczyc? Mysle, ze moje pytanie jest wlasciwie dla tej grupy, przeciez wszyscy piszacy w Perlu maja watroby...
Grupa news:pl.comp.lang.perl sluzy przede wszystkim do dyskusji o zawilosciach jezyka perl. Do dyskucji na temat zagadnien WWW sluzy grupa news:pl.comp.www, a takze news:pl.comp.www.server-side, natomiast w kwestii baz danych nalezy wrocic sie na pl.comp.bazy-danych.
Przed skierowaniem pytania na grupe nalezy sprawdzic czy odpowiedz nie znajduje sie w FAQ (najlepiej siegnac po najnowsza wersje).
W przypadku pytan kierowanych na grupe o perlu, nalezy postawic pytanie, na ktore odpowiedz nie jest zbyt dluga. Gotowych szablonow programow szukac w archiwach na WWW. Jednakze opis problemu nie moze sie sprowadzac do zdania "skrypt mi nie dziala". Warto podac szczegoly, zwlaszcza zacytowac komunikaty.
-- Houston, mamy problem! -- Slyszymy was Apollo, o co chodzi? -- Rakieta nam sie zepsula! Nie dziala! Dobrze jest zapoznac sie z http://rtfm.bsdzine.org/.
2.5. Gdzie jest archiwum grupy pl.lang.comp.perl? http://groups.google.com/groups?oi=djq&as_ugroup=pl.comp.lang.perl http://www.newsgate.pl/archiwum/pl-comp-lang-perl/ http://www.remarq.com/threads.asp?group=pl%2Ecomp%2Elang%2Eperl http://niusy.onet.pl/pl.comp.lang.perl http://usenet.gazeta.pl/usenet/0,1.html?group=pl.comp.lang.perl 2.6. Czy sa w sieci kursy po polsku? Tak. Oto ich lista. Daty w nawiasach to ostatnia modyfikacja. Data sprawdzania: 29.06.00.
2.6.1. kurs Krzysztofa Juszkiewicza http://www.kt.agh.edu.pl/other/perl/ [2.08.99] http://webmaster.gery.pl/index.php?kurs=perl 2.6.2. kurs Kazimierza Pietruszewskiego [05.05.98]:
http://cassel.art.pl/Perl/ http://bit.zsme.tarnow.pl/killer/cgi/kurs/index.htm http://robert.wsi.edu.pl/perl/ http://www.nethut.pl/artykul.php/t/16 2.6.3. Kurs Marcina Nowaka (Chip) http://www.javasoft.pl/sp/perl_index1.html [CGI] http://www.javasoft.pl/sp/perl_index2.html [mysql] 2.6.4. Kurs Lukasza Wierciocha http://wieluk.republika.pl/ 2.6.5. Kurs Michala Stanka http://www.pckurier.pl/webmaster/2000/marzec/stanek/text_1.html http://www.pckurier.pl/webmaster/2000/kwiecien/stanek/perl2.html http://www.pckurier.pl/webmaster/2000/czerwiec/stanek/textperl.html 2.6.6. kurs Bartosza Sawickiego http://www.iem.pw.edu.pl/~sawickib/perl.html [3.11.99] 2.6.7. kurs Mateusza Dutkiewicza http://www.dudzio.pl/perlkurs.htm 2.6.8. kurs Filipa Gralinskiego http://www.ceti.pl/~gralinski/lik320/ 2.6.9. kurs Macieja J. Nowaka http://ygreg.and.pl/perl/ 2.6.10. kurs A. Dawidziuka, P. Bolka http://www.gust.org.pl/BIUL/biul7.html http://www.gust.org.pl/PDF/BIUL/07/04-ad-pb.pdf ftp://ftp.gust.org.pl/TeX/GUST/bulletin/07/04-ad-pb.ps 2.6.11. kurs pod katem CGI http://www.snj.digimer.pl/artykuly.html 2.6.12. kurs anonimowy http://strony2.wp.pl/wp/perl_kurs/ http://www.perl.kurs.prv.pl/ 2.6.13. kurs Macieja Nowaka - poczatki http://www.zamoyski.edu.pl/~mjnowak/ 2.6.14. kurs Andrzeja Zawadki http://www.cgi.one.pl/perl01.shtml 2.7. Czy sa jakies inne strony w Polsce o Perlu? 2.7.1. przyklady (i kurs?) http://web.pertus.com.pl/tech/perl/ http://www.depesz.pl/perl.php http://www.binboy.org/index.php?show=perl.htm [rozne linki] 2.7.2. zastosowania dla WWW: http://www.kaboom.gdynia.top.pl/Perl.htm http://www.ci.pwr.wroc.pl/~jasinski/cgi/ProgramyCGI.zip http://cgi.koti.pl/cgi-bin/perl.shtml (skrypty) http://wojtas.sonik.pl/cgi.html (skrypty) http://koti.pl/~cyberdane/strefa/cgi-bin/perl.shtml (inny link) http://w3.altkom.com.pl/~krzysiek/perl/perl.html (dobre checi) http://www.cgi.csd.pl/index-01.php (skrypty) http://www.binboy.org/bazaprg.php? [link podzielony] parametr=oprogramowanie/webmaster/skrypty/perl 2.7.3. kurs dla administratora Linuxa (Maciej Kozinski) http://www.linux.com.pl/Linux1999/99_08/wielblad.html 2.8. Czy sa manuale dostepne w sieci? Tak, w kazdym CPANie po dodaniu do sciezki /doc/manual/html/ oraz
http://www.mat.uni.torun.pl/help/perlmanual/perl.html http://koala.ichpw.zabrze.pl/perlhtml/perl.htm http://ananke.qdnet.pl/~mgb/perldocs/perl.htm - manual win95 http://www.zasobydev.gery.pl/cgi-bin/php/main.php?podklasa=15&klasa=2&zakres=0 oraz inne strony po angielsku:
2.8.1. CGI-FAQ: http://web.pertus.com.pl/tech/perl-cgi-faq.htm http://zfj.if.uj.edu.pl/computing/perl/ 2.8.2. tutorial: http://web.pertus.com.pl/tech/perldoc/perl5.html http://www.ict.pwr.wroc.pl/doc/perl/perl.html http://www.kis.p.lodz.pl/~cegla/perl/start.html 2.9. Gdzie sa strony zagraniczne? http://www.perl.com/ - strona glowna perla http://www.perl.org/ - zalety perla http://www.cpan.org/ - CPAN http://search.cpan.org/ - wyszykiwarka w CPANie http://www.samag.com/tpj/ - Magazyn The Perl Journal http://www.netcat.co.uk/rob/perl/win32perltut.html - tutorial http://tutorials.boxsource.net/redirect.php?tutorialID=76 - tutorial http://tutorials.boxsource.net/redirect.php?tutorialID=14 - tutorial 2.10. Gdzie sa skrypty zagraniczne? W CPANie oraz:
http://cgi.resourceindex.com/Programs_and_Scripts/Perl/ http://www.worldwidemart.com/scripts/ http://www.freecode.com/ http://www.hotscripts.com/Perl/ http://www.cgi-resources.com/ http://totalscripts.com/pages/Perl_Scripts/ 2.11. Dlaczego nie ma strony o perlu w linkach? Bo autor FAQ o niej nie wie, lub nie dziala [29.06.2000]:
http://sezam.wanet.pl/perl/index.htm - kurs M. Stanka [brak serwera] http://hostidc.idc.com.pl/~siwy/perl.htm - kurs J. Rupnika [nie odpowiada] http://www.ci.pwr.wroc.pl/~martusew/perl.html - kurs W. Martusewicza [brak] http://www.ue.eti.pg.gda.pl/~wojtekz/perl/perl.html - manual [brak] http://lds.mikrus.pw.edu.pl/lang/perl/ - manual [brak serwera] http://lama.supermedia.pl/docs/perl/ - manual [nie odpowiada] http://pc49.uhc.lublin.pl/perl/ - manual [brak serwera] http://moon.int.ids.pl/manual/perl/ - manual [brak serwera] http://eliza.lsb.com.pl/manual/perl/ - kurs K. Pietruszewskiego [brak] http://imtenis.com.pl/webmasternet/cgi/kursperla.htm - jw http://webresources.help.pl/technologie/perl.html - jw http://www.amg.net.pl/Perl/ - archiwum [brak] http://www.rgstudio.com.pl/szkolenia/node9.html - szkolenia [brak serwera] http://pipeta.chemia.pk.edu.pl/Perl/ - kurs [brak] http://www.eden.koti.pl/inne/siec/biblioteka/perl/ - kurs [brak] http://magic-modules.sourceforge.net/ - rezygnacja depesz'a http://sourceforge.net/projects/magic-modules/- rezygnacja depesz'a http://www.pcgyver.obywatel.pl/perl/ - [brak] http://ebook.histeria.pl/programing/perl/ - [brak serwera] http://beta.linuxnews.pl/NewsReader/show_threads.php?group=pl.comp.lang.perl http://www.com.pl/grouplist.phtml?group=pl.comp.lang.perl&cmd_latest=latest 3. Uruchamianie skryptow 3.1. Dlaczego nie moge uruchomic skryptu? - sprawdz czy pierwsza linia ma po znakach #! poprawna sciezke do perla mozesz sprobowac dodac dwa minusy: #!/usr/bin/perl -- - sprawdz czy plik skryptu ma prawa do wykonywania i czytania - sprawdz czy mozesz wykonac inne programy z tego katalogu (./plik) - sprawdz czy wyrzucone sa znaki konca linii z dos'a np. perl -pi -e 's/\r\n/\n/' skrypt perl -p -i.bak -e "s/\r//" plik [wersja dla DOSa] (Uwaga ta dotyczy starszych wersji perla pod Unixami) - sprawdz czy sa naglowki, o ile skrypt uruchamiasz przez WWW - przy windows/dos stosuj skladnie jednolinijkowa w jeden ze sposobow: perl -e "print 'Hello World'" perl -e "print \"Hello World\"" - czy w danym katalogu mozna wykonywac CGI, jesli przez WWW - czy najprostszy skrypt w podobnych warunkach dziala wiecej informacji o skryptach przez WWW w dziale Internet.
3.2. Co oznacza dany blad? 3.2.1. Text file busy Plik byl uzywany przez inny program, lub proba podmiany skryptu w trakcie jego dzialania.
3.2.2. Premature end of script headers Twoj skrypt nie generuje wlasciwych naglowkow HTTP - zobacz w dziale WWW.
3.2.3. Malformed header from script Naglowek HTTP co prawda jest, ale zly - zobacz w dziale WWW.
3.2.4. Wypisywanie znakow nie od razu lub nie w kolejnosci Brakuje tzw. autoflush'a. Dobrze jest na poczatku dodac:
$|=1; 3.2.5. Can't locate Caly komunikat wyglada np. tak:
Can't locate strict.pm in @INC (@INC contains: ...) Oznacza to, ze modul (strict.pm) nie jest zainstalowany w miejscu gdzie powinien, tj. w sciezkach wymienionych w @INC. Moze to najczesciej oznaczac brak modulu (koniecznosc instalacji), lub koniecznosc wskazania sciezki:
use lib 'sciezka'; 3.2.6. Can't load (locate loadable) object Obiekt (modul), ktory chcemy zaladowac istnieje, lecz zawiera bledy. Najczesciej nie ma na koncu 1; (jesli pisalismy sami) lub zostal zle zainstalowany (np. przekopiowany, podczas gdy wymagana byla instalacja).
3.2.7. Can't find string terminator Nie znaleziono zakonczenia tekstu. Nalezy zwrocic uwage czy tekst zakonczenia (np. EOM, _EOF_) jest jedynym w tej linijce i po nim znajduje znak nowej linii oraz nie ma innych znakow jak np. spacja.
3.2.8. Might be a runaway multi-line "" string Najprawdopodobniej nie zostal poprawnie zamkniety cudzyslow wskazujacy ciag znakow.
3.2.9. Can't call method xxx on an undefined value W podanej linii miala zostac wykonana funkcja o nazwie xxx, na obiekcie o podanej wartosci. Nie zostala ona wykonana, gdyz bledem zakonczyla sie wczesniejsza funkcja zapisujaca te wartosc.
3.2.10. Name xxx used only once: possible typo Tu cie perl ostrzega (opcja -w), ze tylko raz uzywasz danej zmiennej. Sprawdz, czy nie zrobiles literowki w nazwie.
3.2.11. Global symbol xxx requires explicit package name Przed pierwszym uzyciem danej zmiennej trzeba dac my lub our, w zaleznosci od zasiegu zmiennej.
3.3. Jak uruchomic z argumentami/parametrami? Chodzi o uruchomienie typu:
./test.pl -a1 -b2 W skrypcie dostep do argumentow jest poprzez wektor @ARGV, czyli w tym przypadku w $ARGV[0] bedzie wartosc "-a1". Do uzywania z duchem Unixa, tj. tak by wartosc powyzszego a byla 1, sluzy ponizszy schemat:
use Getopt::Std; getopts("a:b:"); print "${opt_a}\n"; print "${opt_b}\n"; 3.4. Jak uruchomic inny program ze skryptu? Do uruchamiania sluzy polecenie system (patrz nizej) lub uzycie skladni `komenda`. Dobrze jest tez uzywac pelnych sciezek do komend np. trzy sposoby wywolania komendy finger root:
@linie_odpowiedzi = `/usr/bin/finger root` $status_komendy = system ("/usr/bin/finger root"); open(IN,"/usr/bin/finger root |"); @linie_odpowiedzi=; close IN; Nie nalezy stosowac exec, bo nie zwraca, tzn. po wywolaniu tej funkcji nowy proces (program) zastepuje ten aktualnie wykonywany i nastepne polecenia po exec nie beda wykonane.
Jesli chcemy wywolac skrypt poleceniem system i zobaczyc tekst:
use IPC::Run qw(run); my @cmd = qw(echo -n to ma iœc na stdout); run \@cmd, \'', \my $out, \my $err or die "run <@cmd>: $!"; print "polecenie <@cmd> zwrocilo '$out' na STDOUT i '$err' na STDERR\n"; Powyzszy kod jest najbezpieczniejszy. Inny skrypt perla mozna tez uruchomic:
$wynik = do "nazwaskryptu.cgi"; Do dwustronnej komunikacji z zewnetrznym programem, jesli mamy mozliwosc jego modyfikacji sluza funkcje IPC (man perlipc). Jesli potrzeba udawac uzytkownika w przykladzie z finger nalezy zamiast open uzyc open2 (IPC::Open2) lub open3 (IPC::Open). Alternatywa jest modul Expect.
3.5. Jak uruchomic z prawami roota? Opis problemu bezpieczenstwa znajduje sie w manie perlsec. Schemat skryptu:
$ENV{'PATH'} = '/bin:/usr/bin'; delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'}; #bezpieczne srodowisko system('id'); # sprawdzenie kto wykonuje skrypt $<=$>; # ustaw rzeczywiste id na efektywne id $(=$)+0; # ustaw rzeczywiste gid na efektywne gid system('id'); # sprawdzenie praw dzialanie polega na uruchomieniu perla z odpowiednimi prawami najlepiej przez sudo (http://www.courtesan.com/sudo/), a w starszych wersjach z suidperl.
3.6. Jak uruchomic na/co okreslony czas? { local $SIG{ALRM} = sub { die "TIMEOUT\n" }; alarm( 10 ); # maksymalny czas operacji w sekundach eval { # tutaj operacje ktore moga trwac zbyt dlugo - np. laczenie sie # do odleglego serwera alarm(0); # wylaczamy timeout }; if( $@ eq "TIMEOUT\n" ) { # byl timeout } elsif( $@ ) { # byl jakis inny fatal error } else { # bylo OK } } To dziala tak, ze w przypadku gdy operacje wewnatrz eval{ } przekrocza zadany czas, system generuje sygnal ALRM, ktory z kolei powoduje wykonanie die i "wyskoczenie" poza eval{ }, z ustawieniem $@ na "TIMEOUT\n".
To rozwiazanie nie jest w 100% bezpieczne, bo obsluga sygnalow w perlu (ciagle) nie jest w 100% bezpieczna. Ale przy malo krytycznych zastosowaniach sprawdza sie doskonale.
W srodowisku Windows nie ma funkcji alarm, wiec trzeba sie posluzyc modulami serii Win32.
Do uruchamiania co jakis czas lepszym rozwiazaniem jest zastosowanie np. crona.
3.7. W czym pisac skrypty? Najlepszym edytorem jest ulepszony vi o nazwie VIM. Posiada np. podswietlanie skladni. Jest tez makro robiace z kodu perla, hateemela pokolorowanego zgodnie z biezacymi ustawieniami. Aby go wlaczyc nalezy wpisac :syntax on
http://www.vim.org ftp://ftp.pl.vim.org/pub/vim Do funcji debug przyda sie http://iijo.org/vimDebug/
Inne polecane edytory:
http://www.ultraedit.com http://www.dzsoft.com/dzperl.htm Dobre srodowiska IDE:
http://open-perl-ide.sourceforge.net/ http://www.activestate.com/Products/Komodo/ http://www.solutionsoft.com/perl.htm http://www.perl-express.com/ 3.8. Jak testowac skrypty? Przydatne przy testowaniu skryptow jest uzywanie opcji -w w jednym z dwoch wariantow (z linii komend lub w pierwszej linii skrytpu):
perl -w skrypt.pl #!/usr/local/bin/perl -w Pomocne, choc dosc uciazliwe jest stosowanie konstrukcji:
use warnings; use strict; use diagnostics -verbose; Warto tez zwrocic uwage na sprawdzanie czy wywolanie funkcji powiodlo sie, czyli co ona zwrocila. Na przyklad przy otwieraniu pliku mozna zastosowac:
open PLIK,"plik.txt" or die "Otwarcie pliku: $!"; Testowanie struktur danych w programie ulatwia modul Data::Dumper, np.:
use Data::Dumper; print Dumper(\@a); Uruchamiajac skrypt z opcja perla -d (podobnie jak wyzej -w) mamy do dyspozycji wbudowany debugger.
Do testowania skryptow CGI polecane jest sprawdzenie, czy przy wykonywaniu z linii komend, nie ma bledow oraz czy wyswietlane sa odpowiednie naglowki. Przykladowe wywolanie skryptu CGI z parametrem nazwa o wartosci nowa:
./skrypt.cgi nazwa=nowa Testowanie CGI mozna takze wykonywac na lokalnym serwerze WWW np. dla systemu Windows. Bardziej polecane jest uzycie serwera Apache ze wzgledu na rozpowszechnienie i zgodnosc.
Do kontroli bledow skryptu dobrze jest go uruchomic z linii komend lub wstawic procedure obslugi bledow (sygnalu DIE) przez WWW:
$SIG{__DIE__} = sub { die @_ if ! defined $^S; # blad w obsludze bledu print "Content-type: text/plain\n\n"; # naglowek dla WWW print "Blad: $_\n"; # opis bledu } Powyzsze mozna takze uzyskac stosujac w skrypcie linie
use CGI::Carp 'fatalsToBrowser'; W CPANie znajduje sie modul CGI::Debug, dzieki ktoremu mozemy sprawdzic co jest nie tak w skrypcie umieszajac linie:
use CGI::Debug(report =>'everything', on=>'errors'); W przypadku braku perla skrypt mozna testowac pod adresem
http://argentavis.hypermart.net/perl/compiler.html 3.9. Czy jest perl dla DOS/Windows? Tak. Wiecej informacji jak zwykle w CPANie w dziale ports. Np.:
ftp://sunsite.icm.edu.pl/pub/CPAN/ports/index.html#win32
Dla WIN 32 to doradza sie: ActivePerl for x86 ze strony http://www.activestate.com/ (http://www.activestate.com/ASPN/Downloads/ActivePerl/) http://theoryx5.uwinnipeg.ca/ppms/
Dla zwolennikow mod_perla przyda sie adres ftp://theoryx5.uwinnipeg.ca/pub/other pod ktorym znajduje sie jego wersja dla tego systemu, a takze moduly bazujace na mod_perlu.
3.10. Czy jest bezplatny serwer z Perlem? Poniewaz Perl jest bezplatny na kazda platforme, wiec mozesz go zainstalowac na swoim komputerze. Jesli jednak chcesz miec dostep do Perla, to zobacz:
http://free.komrel.net/ 3.11. Czy mam modul XX? Moduly generalnie posiadaja rozszerzenie .pm i sa instalowane w jednym z katalogow zawartych w tablicy @INC (wkompilowanej w program perl). Zaimportowane moduly mieszcza sie w hashu %INC. Liste niestandardowych (dodatkowych) modulow zainstalowanych mozna uzyskac po wydaniu polecenia:
perldoc perllocal Komenda
perl -Mnazwa_modulu -e 'print "OK\n"' sprawdzi czy modul da sie zaladowac. Natomiast komenda szukajaca pliki o rozszerzeniu .pm w katalogach zwiazanych z perlem (@INC) to:
perl -e "foreach \$path (@INC) { system(\"find \$path -name '*.pm'\") }" Lista standardowych modulow dla ActivePerla jest znacznie wieksza niz dla wersji dla Unixa. Lista tych pierwszych jest pod:
http://aspn.activestate.com/ASPN/Downloads/ActivePerl/PPM/Packages 3.12. Jak zainstalowac modul? Jesli nie znamy nazwy lub nie mozemy znalezc modulu przydatny moze okazac sie adres http://search.cpan.org/ wyszukiwarki. Modul CPAN tez ma taka mozliwosc (patrz nizej). Niektore moduly wystepuja tylko w pakietach np.
LWP - libwwwperl MIME::* - mimetools Net::* - libnet Instalacja standardowo po sciagnieciu z CPANu (np. GD):
gzip -cd GD*.tar.gz |tar xvf - cd GD-costam # to co sie zrobilo po rozpakowaniu perl Makefile.PL # jesli chcemy na swoim koncie: perl Makefile.PL LIB=~/lib make make test # opcjonalnie make install # do tego trzeba odpowiednie prawa (zwykle root) Szybciej:
perl -MCPAN -e shell cpan> i /GD/ [wyniki] cpan> install GD Przy pierwszym uruchomieniu modul CPAN wymaga konfiguracji i zapisuje ja w pliku CPAN/Config.pm w swoim katalogu bibliotecznym. Dla instalacji niestandardowej mozna go skopiowac jako $HOME/.cpan/CPAN/MyConfig.pm i poprawic.
Dla perla z Activestate, lista: http://aspn.activestate.com/ASPN/Modules instalacja (online):
ppm PPM>install GD PPM>quit offline:
Sciagnac odpowiedniego zipa z http://ppm.activestate.com/PPMPackages/zips/8xx-builds-only/Windows/ - 5.8 http://www.activestate.com/PPMPackages/5.6/zips/ - dla Perla 5.6 http://www.activestate.com/PPMPackages/5.005/zips/ - dla 5.005 lub http://www.activestate.com/ASPN/Downloads/ActivePerl/PPM/Zips Rozpakowac tylko tego zipa w odpowiednim katalogu, a potem ppm install GD.ppd Dla tej wersji Perla istnieje sporo modulow tylko dla Windows z serii Win32::* opisanych w ksiazce "Perl dla administratorow systemow".
Dla modulow zainstalowanych niestandardowo nalezy w skrypcie podac sciezke do nich (i jest ona pierwsza na liscie) np.:
use lib "$ENV{HOME}/lib"; use Nazwa::Modulu; Pierwsza linie mozna zapisac tez jako:
BEGIN { unshift(@INC,"$ENV{HOME}/lib") } lub zastapic ustawieniem zmiennej PERLLIB lub PERL5LIB.
Do kazdej instalacji z CPANu konieczny jest program make (standardowy w *nixie), dla windows uzywamy borlandowego dmake, lub microsoftowego nmake.
ftp://ftp.microsoft.com/Softlib/MSLFILES/nmake15.exe Kolejnosc z nmake jest nastepujaca:
Rozpakowac plik o rozszerzeniu .tar.gz (np. WinZipem) Uruchomic linie polecen i wejsc do katalogu gdzie rozpakowano (np. cd c:\tmp) perl Makefile.PL nmake nmake test nmake install 3.13. Co znajduje sie w danym module? Wszystkie nazwy w module sa dostepne w hashu %nazwa_modulu::
perl -MCPAN -e 'print join "\n", keys %CPAN::' to dla modulu CPAN, zas nazwy funkcji:
perl -MCPAN -e 'print join "\n", grep *{$CPAN::{$_}}{CODE}, keys %CPAN::' 3.14. Czy jest maly perl dla win? http://www.atp.nano.pl/download/perl.zip (ale stara wersja 3.0) 3.15. Jak zostawic dzialajacy skrypt (w tle)? use POSIX; #czesc dzialajaca normalnie fork() and exit(); # rozgalezienie procesu i zakonczenie glownego setsid(); # nowa sesja # zamkniecie urzadzen we/wy close(STDIN); close(STDOUT); close(STDERR); #czesc wykonujaca prace w tle Gotowy do wykorzystania modul to Net::Server::Daemonize
Poniewaz na DOS/Win powyzszy przyklad nie dziala, uzywa sie modulu Win32::Process:
use Win32; use Win32::Process; $perlPath = 'C:/perl/bin/perl.exe'; # Sciezka do perla $skrypt = 'perl -w D:/ppm/test_dbf/import.pl'; # Wywolywany skrypt $workDir = 'D:/ppm/test_dbf'; #Katalog roboczy Win32::Process::Create($Win32::Process::Create::ProcessObj, $perlPath, $skrypt, 0, DETACHED_PROCESS, $workDir) or die print_error(); sub print_error { return Win32::FormatMessage(Win32::GetLastError()); } Do postawienia serwisu na NT przyda sie modul Win32::Deamon ze strony http://www.roth.net
3.16. Jak pokazac, ze skrypt dziala (wiatraczek)? @a=("|","/","-","\\"); while(1) { print $a[0]; push@a, shift @a; sleep 1; print "\b"; } lub
@a=("|","/","-","\\"); while(1) { print "$a[$i++]\r"; $i%=4; sleep 1; } 3.17. A co to sa watki? perldoc perlthrtut
Watki wspoldziela pamiec. Czyli jak w jednym watku zmienisz wartosc zmiennej globalnej, to wszystkie inne watki (z danego procesu) beda ta zmiane widziec.
To oznacza duzo prostsza komunikacje miedzy watkami (nie trzeba kombinowac z pamiecia dzielona/socketami/sygnalami), ale zarazem pojawiaja sie problemy z synchronizacja (wszystkie operacje na zmiennych globalnych trzeba zabezpieczac semaforami).
Poza tym watki sa duzo tansze, tzn. utworzenie nowego watku jest duzo mniej kosztowne niz utworzenie nowego procesu. No i oczywiscie zajmuja mniej zasobow niz procesy.
3.18. Czy skrypt moze co sekunde cos robic? Jesli potrzeba, by skrypt co pewien czas dal znac o tym co robi, mozna wykorzystac do tego sygnaly:
$| = 1; $SIG{ALRM} = sub { print '#'; alarm 1; }; print "Zaczynam\n"; alarm 1; for (1..10000000) { }; # cos dlugiego # skonczone, kasujemy alarm i obsluge alarm 0; delete $SIG{ALRM}; print "Skonczylem\n"; W srodowisku Windows nie ma funkcji alarm, wiec trzeba sie posluzyc modulami serii Win32.
3.19. Czy jest proces nr X? use POSIX qw(:errno); if( ! kill( 0, $X ) && $! == ESRCH ) { print "procesu nie ma"; } else { print "proces jest"; } 3.20. Jak dostac liste procesow? Jesli chodzi o unixa, mozna uzyc najszybszego rozwiazania:
$wynik = `ps aux`; Alternatywa jest modul Proc::ProcessTable.
3.21. Jak obslugiwac kilka zadan rownolegle? Tworzymy np. 10 procesow potomnych (w tle), ktore wysylaja cos do rodzica i koncza dzialanie po losowym czasie. Rodzic odczytuje przez potok (pipe) i wypisuje na ekran.
# do konwersji numer procesu -> deskryptor my %pid2fh; no strict 'refs'; for my $i ( 1..10 ) { #otwarcie potoku do czytania i rozdwojenie procesu my $pid = open( "F$i", "-|" ); if( $pid ) { $pid2fh{$pid} = "F$i"; } #zapis deskryptora jesli rodzic else { my $timeout = int rand 10; # losowe opoznienie exec "sleep $timeout; echo 'Hello, I am $$'"; # zakonczenie napisem }; } while( 1 ) { my $pid = wait; # czekaj na potomka last if $pid < 0; # jesli nie ma zadnego koniec petli # proces $pid zakonczyl dzialanie, czytamy co zrobil... my $fh = $pid2fh{$pid}; while(<$fh>) { print "[$pid]: $_"; } } open F, "-|" powoduje "rozforkowanie" procesu, w procesie potomnym wynikiem tej funkcji jest 0 (co wykorzystujemy powyzej aby uruchomic zadanie zewnetrzne przez system - exec bylby tu optymalniejszy), natomiast proces pierwotny otrzymuje jako wynik funkcji pid procesu potomnego. Co wazniejsze, tak stworzony proces ma od razu swoje standardowe wyjscie podpiete do otwartego wlasnie filehandle, wiec mozemy z niego czytac.
Funkcja wait zwraca pid procesu ktory sie zakonczyl, lub -1 jezeli nie ma juz zadnych dzialajacych procesow potomnych (jezeli sa procesy potomne ale zaden sie jeszcze nie skonczyl, funkcja wait zatrzymuje sie az do czasu zakonczenia jednego z procesow potomnych).
Do komunikacji dwustronnej mozna wykorzystac funkcje open2 oraz manual perlipc.
3.22. Co to jest kompilator perla? Perl jest jezykiem interpretowanym, do jego uzycia potrzebny jest zatem interpreter o nazwie perl. Istnieja jednak programy do zamiany formatu tekstowego skryptu na format wykonywalny - nazywane kompilatorami. Sa one w przeciwienstwie do perla platne. Sa to:
perlcc (freeware wraz z perlem) perlapp (licencja: 195$, tydzien free) http://www.activestate.com/Products/Perl_Dev_Kit/index.html perl2exe (licencja pro: 149$, lite: 49$) http://www.indigostar.com/perl2exe.htm p2xstd.exe (???) perlapp i perl2exe potrafia tworzyc biblioteki dll, przez co skrypt jest mniejszy. Czasem trzeba deklarowac niepotrzebne normalnie biblioteki lub wydac polecenie:
perl2exe_include IO/File.pm lub umiescic w kodzie komentarz:
use Archive::Zip; #perl2exe Skrypt po skompilowaniu jest nieczytelny dla czlowieka, nie potrzeba do jego wykonania interpretera, zajmuje przecietnie okolo 1MB. Nie jest to jednak zadne zabezpieczenie przed probami odczytania kodu zrodlowego (np. modul B::Deparse) http://www.perlmonks.com/index.pl?node_id=237943 http://www.perlmonks.com/index.pl?node_id=232983 Lepiej do tegu uzyc pakietu PAR, Filter, ACME lub SHC.
Skompilowany skrypt jest przydatny gdy nie chcemy instalowac perla.
Alternatywa polecana zamiast perl2exe jest uzycie pakietu PAR.
3.23. Jak ukryc kod programu? Wlasciwie nie da sie ukryc kodu na pewno. Pewnym rozwiazaniem jest jego zaciemnienie (np. przez skrypt wsadzenie wszystkiego w jedna linie, lub dziwne lamania linii, bez komentarzy, bez formatowania, z duza liczba zmiennych domyslnych). Lecz ciezko sie wtedy poprawia i mozna to latwo "odciemnic", np.:
#!/usr/bin/perl -pi.bak BEGIN{ @ARGV or print "\nusage: ./wciecia.pl filename\n\n" and exit; } s/^\s*/"\t" x $count/e; $count += tr/{// - tr/}//; Inne rozwiazanie to kompilacja, ktora jest procesem odwracalnym. Jedynie wstawienie skryptu przez WWW, tak ze widoczne sa tylko wyniki jego dzialania, zabezpiecza przed dostepem do kodu zrodlowego.
|
|
 | | From: | Krzysztof Juszkiewicz | | Subject: | FAQ pl.comp.lang.perl FAQ cz. 2 (290) | | Date: | 06 Jan 2005 03:00:02 CET |
|
|
 | URL: http://www.kt.agh.edu.pl/other/perl/faq/ Last-Modified: Fri Jun 4 10:10:53 2004 Archive-name: pl/comp/lang/perl-faq/2 Part: 2 Posting-Frequency: monthly (6th)
4. WWW Zalecane jest zadawanie pytan dotyczacych WWW na grupie pl.comp.www.server-side
4.1. Jak pisac CGI? CGI, czyli Common Gateway Interface, to zestaw regul, ktore musi spelnic program (napisany w dowolnym jezyku, w tym w Perlu), aby mozna go bylo "podpiac" do serwera WWW tak, aby serwer go uruchamial, a do przegladarki wysylal wynik dzialania tego programu.
Zadaniem skryptu CGI jest odebranie parametrow zadania z metody GET lub POST (na przyklad wypelnionego formularza), wykonanie zwiazanych z tym zadan i wygenerowanie odpowiedzi zawierajacej strone (lub fragment) HTML.
Specyfikacja protokolu do komunikacji z serwerem WWW (HTTP 1.1) znajduje sie w dokumencie RFC 2616 dostepnym w archiwach rfc.
4.2. Czym sie rozni Perl od CGI? CGI nie jest jezykiem programowania, jak Perl. Jest pewnym standardem wymiany informacji pomiedzy serwerem, a przegladarka. Mozna go realizowac w kazdym jezyku, ktory potrafi wysylac tekst na STDOUT. Perl jest bardzo wygodny ze wzgledu na duze mozliwosci przy przetwarzaniu tekstow.
W perlu pomocny jest modul CGI. Przed umieszczeniem skryptu na serwerze dobrze jest go przetestowac (patrz testowanie skryptow).
4.3. Jak przetwarzac formularz (z modulem CGI)? Sluzy do tego modul CGI
use CGI; # zaladowanie modulu $cgi = new CGI; # nowy obiekt typu CGI $pliczek = $cgi->param("log"); # pod zmienna pliczek podstaw wartosc pola log #zapisanie calego formularza do pliku o nazwie wartosci open (OUT,">wartosci"); # otwarcie pliku $cgi->save(OUT); # zapis close OUT; # zamkniecie W zmiennej $pliczek znajdzie sie napis z polskimi literami (o ile wystapily) i innymi znakami, ktore beda juz zdekodowane. Najprawdopodobniej polskie litery beda w standardzie CP i to trzeba poprawic (patrz poprawianie polskich liter).
Oprocz odebrania danych nalezy wyslac odpowiedz do przegladarki.
4.4. Co to jest cgi-lib? Biblioteka cgi-lib jest hitoryczna zaszloscia i zamiast niej uzywa sie standardowego modulu CGI. Jesli zachodzi potrzeba wykorzystania kodu uzywajacego tej biblioteki poleca sie nastepujaca zamiane:
require 'cgi-lib.pl'; &ReadParse; $wartosc_query_w_url = $in{'query'}; na
use CGI; CGI::ReadParse(); $wartosc_query_w_url = $in{'query'}; 4.5. Jak wysylac odpowiedz do przegladarki? Dobrze jest uzyc do tego modulu CGI, lub zawsze pamietac o linijce zawierajacej Content-type: np.
print "Content-type: text/html\n\n"; linia ta jest obowiazkowa i wraz innymi dodatkowymi tworzy naglowki. Po wszystkich liniach naglowkow musi byc pusta linia. Brak tych dwoch kryteriow daje blad "500 Internal Server Error".
Kazdy skrypt CGI, zanim wypisze na STDOUT zawartosc strony, musi wypisac kilka magicznych linijek tworzacych tzw. naglowek - pozwala on np. serwerowi stwierdzic co konkretnie przesylamy (HTML, tekst, obrazek). Zasadniczo to o czym wiekszosc poczatkujacych musi wiedziec, to ze na poczatku skryptu w perlu trzeba umiescic cos takiego:
print "Content-type: text/html; charset=ISO-8859-2\n\n"; lub
use CGI qw(:standard); $query = new CGI; print $query->header(-type => 'text/html', -charset => 'ISO-8859-2'); Spowoduje to wyswietlenie naglowka zawierajacego jedna linie, ktora z kolei informuje co bedziemy przesylac (dokument HTML) oraz przy okazji podaje sposob kodowania polskich liter jako ISO-8859-2 (jezeli w danym dokumencie nie ma polskich znaczkow, mozna pominac srednik i "charset=...")
Zamiast "text/html" mozemy umieszczac takze np. "text/plain" jezeli przesylamy dokument tekstowy (nie HTML), albo "image/gif" lub "image/jpeg" jezeli przesylamy obrazek odpowiedni GIF lub JPG (wtedy po naglowku wypisujemy zawartosc pliku z obrazkiem "jak leci" bajt po bajcie).
Po wypisaniu w ten sposob naglowka mozemy juz wypisywac cokolwiek (chociaz dobrze byloby zeby bylo to poprawny HTML - chyba ze w naglowku podalismy inny typ danych).
Dla obslugi WAP konieczny jest zamiennik:
print "Content-type: text/vnd.wap.wml\n\n"; Niestety to nie wystarczy. Musisz jeszcze dodac linijki:
"http://www.wapforum.org/DTD/wml12.dtd> No w koncu reszta nie moze byc pisana w HTML, ale w WML. Jezyk to podobny do HTML, ale ma kilka haczykow:))
4.6. Jak wyslac plik do przegladarki? print "Content-type: application/octet-stream\n"; print "Content-Disposition: attachment; filename=NAZWA_PLIKU_Z_ROZSZERZENIEM\n\n"; Otwieramy plik binarnie i wypluwamy do przegladarki:
open AA,"plik.bin"; #binmode STDOUT; #w niektorych systemach ta jest linia potrzebna #binmode AA; #jak wyzej print join '',; #te linie mozna zamienic na: undef $/; print ; close AA; W IE moze wystapic problem zapisu jako index.html, trzeba wowczas w href= wywolojacym skrypt dodac target=_blank.
4.7. Jak wyslac plik z dysku na serwer WWW? Mozna to wykonac jedynie przez metode POST. Trzeba napisac w kodzie HTMLa formularz z liniami:
|
|
 | | From: | Krzysztof Juszkiewicz | | Subject: | FAQ pl.comp.lang.perl FAQ cz. 3 (290) | | Date: | 06 Jan 2005 03:00:02 CET |
|
|
 | URL: http://www.kt.agh.edu.pl/other/perl/faq/ Last-Modified: Fri Jun 4 10:10:53 2004 Archive-name: pl/comp/lang/perl-faq/3 Part: 3 Posting-Frequency: monthly (6th)
8. Obsluga plikow 8.1. Jak otworzyc plik? 8.1.1. > - tylko do zapisu. Jesli plik nie istnieje, zostanie utworzony. Jesli istnieje, jego poprzednia zawartosc zostaje wymazana.
8.1.2. < - tylko do odczytu. Domyslny sposob otwarcia pliku.
8.1.3. >> - tylko do dopisywania. Wszelkie informacje sa dodawane na koncu pliku.
8.1.4. +>> - odczyt/dopisywanie. Jak wyzej z odczytem.
8.1.5. +< - odczyt/zapis. Mozna pisac i czytac w dowolnym miejscu.
8.1.6. +> - odczyt/zapis. Jak wyzej. Zawartosc pliku zostaje na poczatku wymazana.
8.2. Jak ustawic sie w zadanym miejscu? Gdy znane jest miejsce w bajtach nalezy uzyc seek(PLIK, przesuniecie, skad). Parametr skad okresla wzgledem czego podajemy przesuniecie
- od poczatku pliku (skad = 0) - od aktualne pozycji (1) - od konca pliku (2) Gdy nie jest znane miejsce nalezy go ustalic tworzac indeksy (polozenie miejsc charakterystycznych) na przyklad w osobnym pliku. Czytanie od zadanej linii jest niemozliwe bez wczytania poprzednich linii.
8.3. Jak dopisac/poprawic w zadanym miejscu? Ogolnie da sie jedynie nadpisywac w srodku pliku poprzez zamiane znakow (open FH,"<+plik") lub dopisywac na koncu (open FH,">>plik"). W celu dodania lub skasowania czegos ze srodka lub poczatku pliku, nalezy przepisac caly plik.
Do dyspozycji jest takze konstrukcja jednolinijkowa zamieniajaca np. piata linie:
perl -pli -e '$_="nowa piata linia" if $.==5' plik 8.4. Jak znalezc pliki w katalogu? Nie nalezy stosowac konstrukcji uruchamiajacych program zewnetrzny, ktore moga spowalnic dzialanie (przykladowo pliki z rozszerzeniem .txt):
@pliki = `ls *.txt`; @pliki = glob('*.txt'); Zamiast niej lepiej uzyc:
opendir(KATALOG,"."); @pliki = grep { /\.txt$/ } readdir KATALOG; closedir KATALOG; By ustawic znalezione powyzej pliki z rozszerzeniem .txt (pomijajac grep'a - wszystkie) w kolejnosci czasow modyfikacji:
@pliki = sort { (stat($b))[9] <=> (stat($a))[9] } @pliki; Do szukania (/usr/home) rowniez w podkatalogach (plikow .pm) mozna uzyc systemowego find lub lepiej modulu File::Find.
use File::Find; %found = ( ); find( \&wanted, '/usr/home' ); $wynik = join "\n", keys %found; print "$wynik\n"; sub wanted { $found{( split "/", $File::Find::name )[4] } = 1 if /\.pm$/; } Uproszczona wersja tego modulu to File::List. Jest tez polecenie systemowe find2perl, konwertujace systemowego find'a na skrypt perlowy.
8.5. Jak wyluskac nazwe pliku/katalogu? Najlepszym i przenosnym rozwiazaniem jest modul File::Basename. Mozna tez uzyc wyrazenia regularnego: /([^\/]+)$/
8.6. Jak odczytac/zmienic haslo w pliku (dodac uzytkownika)? Moduly/funkcje HTTPD::UserAdmin i HTTPD::GroupAdmin obsluguja plik z haslami w formacie tekstowym, dbm, Berkley DB, lub innym zgodnym z DBI:
use HTTPD::UserAdmin (); HTTPD::UserAdmin ->new(DB => "/foo/.htpasswd") ->add($username => $password); Do wczytania hasla z klawiatury dobrze jest uzyc modulu Term::ReadKey lub Term::ReadLine, Term::ReadPassword.
use Term::ReadKey; ReadMode('noecho'); $password = ReadLine(0); ReadMode('restore'); Jesli perl (i system hasel ukrytych) zostal poprawnie zainstalowany funkcje getpw*() [np. getpwnam()] daja dostep do odczytania hasel uzytkownikow. (Przy systemie hasel ukrytych tylko, gdy sa wywolywane przez administratora)
$pwd = (getpwuid($<))[1]; $salt = substr($pwd, 0, 2); # salt to pierwsze dwa znaki hasla if (crypt($haslo, $salt) ne $pwd) { die "Sorry...\n"; } else { print "ok\n"; } Zmiana hasla wiaze sie ze stworzeniem nowego pliku w odpowiednim formacie, opisanym w manie do passwd i zainstalowaniem go za pomoca opisanej w UNIXowym manie funkcji pwd_mkdb. Haslo nalezy wczesniej zakodowac, przy uzyciu funkcji crypt za pomoca wygenerowanego wczesniej (patrz nizej) dwubajtowego salta.
Przydatny moze okazac sie modul Authen-PAM.
W przypadku kodowania hasel MD5 zastosowanie znajduje odpowiedni modul:
use MD5; $md5=new MD5; $md5->add("$haselko"); $digest= $md5->digest(); lub
use Crypt::PasswdMD5; print unix_md5_crypt("alamakota", "QYeZBvQu")."\n"; W zakodowanym hasle salt jest miedzy drugim a trzecim znakiem $.
Do wygenerowania hasla moze sluzyc ponizsze.
@chars = ( "A" .. "Z", "a".."z", 0..9, qw(! @ $ % ^ & * )); $string = join("",@chars[ map { rand @chars } ( 1 .. 64 ) ]); 8.7. Jak sprawdzic prawa dostepu do pliku? man 2 stat:
$mode = sprintf "%04o", (stat $file)[2] & 0777; jest jeszcze dodana stala 0100000 - oznaczajaca zwykly plik.
Oprocz stat jest jeszcze funkcja -X (perldoc -f -X) z roznymi sprawdzaniami pliku.
8.8. Jak sprawdzic date modyfikacji pliku? my ($s, $min, $h, $d, $m, $y, $weekday); if($filename and -e $filename) { ($s, $min, $h, $d, $m, $y, $weekday) = localtime((stat(_))[9]); # juz raz bylo stat, wiec mozna uzyc _ $y += 1900; $m ++; # zeby byl z przedzialu 1-12 } lub
use POSIX; use File::stat; print strftime "%d-%m-%Y", localtime( (stat($filename))->mtime ); 8.9. Jak uaktualnic daty modyfikacji/dostepu plikow? $teraz=time; utime $teraz,$teraz,@lista_plikow; 8.10. Jak sprawdzic wielkosc (rozmiar) pliku? Jedna z linijek:
$wielkosc=(stat("nazwa-pliku.txt"))[7]; $wielkosc= -s "nazwa-pliku.txt"; $wielkosc=(stat("nazwa-pliku.txt"))->size; 8.11. Jak skopiowac/przesunac plik? Mozna to zrobic na dwa sposoby. Jesli chodzi o szybkosc to mozna uruchomic zewnetrzny program lub uzyc modulu File::Copy. Jesli chodzi o kontrole i wiecej pisania (i jak twierdza niektorzy przenosnosc) to przepisywanie open/read/write/close.
Do zmiany nazwy sluzy funkcja rename.
8.12. Jak moge usunac plik? unlink($filename); 8.13. Jak zmniejszyc plik? Jest funkcja "truncate", ktora pozwala "przyciac" otwarty plik, np:
truncate F, 1000; obcina plik otwarty jako F do 1000 bajtow. Tylko ze ta funkcja nie musi dzialac - musisz przetestowac czy w Twoim systemie operacyjnym jest zaimplementowana.
8.14. Jak rozpoznac typ pliku? Najlepiej po rozszerzeniu, a gdy go nie ma, przyda sie modul File::MMagic. Do sprawdzenia czy jest binarny/tekstowy - operatory: -T, -B.
8.15. Czy mozna zapisac do pliku cala strukture danych? Zapisanie do pliku tablicy czy hasza (nawet wielopoziomowego) jest mozliwe za pomoca modulu Data::Dumper.
8.16. Jaka funkcja sluzy do ograniczania dostepu do pliku? Do blokowania dostepu do pliku sluzy funkcja flock().
Funkcja ta nie dziala na systemach firmy Microsoft. Zamiast niej stosujemy moduly LockFile::Simple lub File::Lock.
Flock ma dwa parametry: uchwyt pliku i rodzaj operacji.
use Fcntl ':flock'; sub lock { flock(MBOX,LOCK_EX); seek(MBOX, 0, 2); } sub unlock { flock(MBOX,LOCK_UN); } open(MBOX, ">>/usr/spool/mail/$ENV{'USER'}") or die "Can't open mailbox: $!"; lock(); print MBOX $msg,"\n\n"; unlock(); By funkcja flock dzialala poprawnie plik musi byc otwarty do pisania (lub dopisywania), czyli mozna ograniczac po otwarciu i przed zamknieciem pliku. Zamkniecie pliku znosi ograniczenie.
flock(LOCK_EX) blokuje wszystkie procesy probujace zrobic flock na tym pliku. flock(LOCK_SH) blokuje procesy probujace zrobic flock(LOCK_EX) (w domysle: piszace do pliku), ale nie blokuje procesow wykonujacych flock(LOCK_SH). W rezultacie wiele procesow czytajacych ma jednoczesnie dostep do pliku, ale proces piszacy zostanie zablokowany do czasu, az wszystki czytajace zwolnia blokade.
Flock czeka na odblokowanie, o ile nie dodasz LOCK_NB, wtedy wroci z bledem i mozesz na to zareagowac.
(LOCK_SH = 1, LOCK_EX = 2, LOCK_NB = 4, LOCK_UN = 8 - zazwyczaj). 8.17. Gdzie znajduje sie biezacy katalog (.)? use Cwd; $dir = cwd;
8.18. Jak przekierowac STDOUT/STDERR? Do przekierowania nigdzie (na null):
open( STDOUT, ">/dev/null" ); open( STDERR, ">/dev/null" ); lub:
close (STDOUT); close (STDERR); 8.19. Czym generowac RTF? Po porownaniu RTF::Document v0.64 i RTF::Writer v1.06, trzeba stwierdzic, ze RTF::Writer wydaje sie bardziej dopracowany (sam numer wersji moglby juz na to wskazywac). Sam przykladowy skrypt do RTF::Document sieje bledami, tak ze na sprawna wersje tego modulu chyba trzeba troche jeszcze poczekac.
8.20. Jak zrobic PDF? Perlem tworzymy plik latexowy, a LaTeX swietnie robi pdfy. Alternatywa: http://xml.apache.org/fop/
8.21. Jak obsluzyc plik po kompresji? Moduly:
Archive::Zip Archive::Tar Compress::Bzip2 Compress::Zlib (do gzipa) PerlIO::gzip 8.22. Jak policzyc sume kontrolna CRC? Dla calego drzewa katalogow:
use Digest::MD5; $dx = new Digest::MD5; subdir($DIR); print "MD5($DIR) = ", $dx->hexdigest, "\n"; sub subdir { my $dir = shift; opendir(D, $dir); my @list = grep { ! /^\.\.?$/ } readdir(D); closedir(D); for(@list) { if (-d "$dir/$_") { subdir("$dir/$_"); } elsif (-f _) { open(F, "$dir/$_"); $dx->addfile(F); close(F); } } } 9. Bazy danych Zaleca sie przeniesc na grupe pl.comp.bazy-danych oraz zajrzec do jej FAQ http://www.dbf.pl/faq/
9.1. Jak zaczac prace z baza danych? Do poprawnego dzialania potrzebny jest dzialajacy serwer baz danych (moze byc gdzies w sieci) oraz lokalny klient (lub biblioteki - drajwery).
- sciagnac i zainstalowac DBI - sciagnac i zainstalowac odpowiednie DBD - poczytac odpowiednie manuale (np. perldoc DBD::mysql) Ogolnie schemat jest nastepujacy:
use DBI; $dbname="nazwabazy"; $dbdbd="mysql"; #lub Sybase lub Pg lub inna nazwa DBD $username="nazwauzytkownika"; $password="haslo"; $table="tabelka"; my $dbh = DBI->connect( "dbi:$dbdbd:$dbname", $username, $password); my $sth = $dbh->prepare( "select * from $table" ); $sth->execute() || die $sth->errstr; while ( my $row = $sth->fetchrow_arrayref() ) { print "@{$row}\n"; } $dbh->disconnect(); 9.2. Co zrobic z plikiem dbf? Istnieja dwa konkurencyjne rozwiazania do dbf i FoxPro, sa to: Xbase oraz XBase. Na podstawie tego drugiego powstal interfejs przez DBI, czyli sterownik DBD-XBase.
use XBase; my $table = new XBase("dbase.dbf") or die XBase->errstr(); for (0 .. $table->last_record()) { my ($deleted,$id,$msg) = $table->get_record($_,"ID","MSG"); print "$id:\t$msg\n" unless $deleted; } 9.3. Jak czytac pliki dbm? Nie nalezy juz stosowac funkcji dbmopen, itp. lecz tie.
use GDBM_File ; tie %hash, 'GDBM_File', $filename, &GDBM_WRCREAT, 0640; $hash{bzt} = 'tralala'; dodatkowe informacje:
perldoc NDBM_File, DB_File, AnyDBM_File Do wielopoziomowych struktur dbm sluzy modul MLDBM (multi-level DBM) lub Storable.
9.4. A co z Excelem (CSV - plik srednikowy/przecinkowy)? Do wspolpracy z Excelem warto uzywac obslugi przez DBI (DBD::Excel) lub formatu CSV (DBD::CSV). Alternatywy to Text::CSV oraz Tie::CSV.
Proste dzielenie pol po przecinkach z cudzyslowem daje wyrazenie
@pola = m/([^,]*|".*?"),?/g; Z platformy Windows zaleca sie modul Win32::OLE.
$excel=Win32::OLE->new('Excel.Application','Quit'); $plik=$excel->Workbooks->Open($nazwapliku); $i=1; while($plik->Worksheets($i)){ $ark=$plik->Worksheets($i); $zawartosc=$ark->UsedRange()->{Value}; $i++; } $excel->Quit; Ostatecznie mozna wykorzystac moduly Spreadsheet::WriteExcel i Spreadsheet::ParseExcel, lub program zewnetrzny xlhtml, ktory pozwala skonwertowac plik xls do ascii (z roznymi opcjami).
9.5. A z Accessem? DBD::ODBC (lub DBD::ADO - o ile ma sie sterowniki ADO w systemie [na Win NT - min. SP4]), zobacz tez komentarze nizej.
use DBI; my $baza = 'd:\test\test.mdb'; my $driver = 'Microsoft Access Driver (*.mdb)'; my $dsn = "driver=$driver;dbq=$baza"; my $dbh = DBI->connect("dbi:ODBC:$dsn",",") or die $DBI::errstr; Jest tez Win32::ODBC, ale jest wolny i niedoskonaly.
9.6. Czy jest cos do MS-SQL? DBD::Sybase, lub DBD::ODBC.
Pierwszy jest szybszy i mniej pamieciozerny. MS SQL ma w sobie silnik Sybase'a i modul ten w 98% przypadkow swietnie sie do MS SQL'a nadaje.
Pierwszy jest raczej dla srodowiska Unix (i bezplatny) drugi raczej dla Windows. (Uwaga! dla NT 4.0 Workstation z NTFS, i ActivePerl'a 5.6, potrzeba SP5, lub wiecej, bo inaczej moga pojawic sie klopoty z prawami dostepu skryptu do microsoftowych sterownikow jet)
9.7. Czym parsowac XML/SGML? use XML::Parser; $p = new XML::Parser(Style => 'Debug'); $p->parsefile('plik.xml'); Poza tym modul XSLT, a takze do czytania XML - XML::XPath, a do manipulacji - XML::DOM. Prosty modul to XML::Simple:
my $xs = new XML::Simple(ProtocolEncoding => 'ISO-8859-2'); Inny przyklad:
use XML::LibXSLT; use XML::LibXML; my $parser = XML::LibXML->new(); my $xslt = XML::LibXSLT->new(); my $sklep = $parser->parse_file( 'sklep.xml' ); my $index_doc = $parser->parse_file( 'index.xsl' ); my $index_styl = $xslt->parse_stylesheet( $index_doc ); $results = $index_styl->transform( $sklep ); $xx = $index_styl->output_string( $results ); Wiecej implemetacji mozna znalezc pod:
http://www.xml.com/pub/rg/Perl_Implementations http://perl-xml.sourceforge.net/faq/#cpan_modules 10. Grafika 10.1. Jak tworzyc obrazki? Do obslugi gifow lub png przydatna jest biblioteka GD. (http://www.boutell.com/gd/) Od wersji 1.6 obsluguje ona format PNG zamiast GIF. W Polsce, jak twierdza niektorzy, mozna generowac gify legalnie (tj. bez licencji), korzystajac np. z http://www.rime.com.au/gd/
Przyklad na gifa o wymiarach 1x1 niewidocznego (przezroczystego) dla WWW:
use GD; my $img = new GD::Image(1,1); my $white = $img->colorAllocate(255,255,255); $img->transparent($white); $img->fill(0,0,$white); print "Content-type: image/gif\n\n"; #binmode STDOUT; #podobno czasem trzeba, czasem nie print $img->gif; Albo (rownowaznie) tak:
print "Content-type: image/gif\n\n"; my @EMPTYGIF = qw ( 71 73 70 56 57 97 1 0 1 0 128 0 0 255 255 255 0 0 0 33 249 4 1 0 0 0 0 44 0 0 0 0 1 0 1 0 0 2 2 68 1 0 59); foreach (@EMPTYGIF) { print chr; } Bardziej rozbudowana biblioteka to np. PerlMagick - obsluguje wiekszosc obrazkow.
10.2. Czym przetwarzac obrazki? Uzyteczny moze byc modul PerlMagick, zas do sprawdzenia rozmiarow Image::Size, a do wszelkich informacji Image::Info.
10.3. Jak robic wykresy? W oparciu o GD przydatny jest modul Chart do tworzenia wykresow. Nie do pogardzenia takze GIFgraph.
10.4. Jak tworzyc grafike tekstowa? Nalezy stosowac modul Curses (lub Tk do GUI) lub Curses::UI:
use Curses::UI; my $cui = new Curses::UI(-clear_on_exit => 1); my $win1 = $cui->add('win1' , 'Window', -border => 1, -clearscreen => 1, -title => 'My first Curses::UI window!', -pad => 6,); my $but1 = $win1->add( 'buttons', 'Buttonbox', -x => 2, -y => 4, -buttons => [ { -label => '< goto window 2 >', -value => 'goto2' }, { -label => '< Quit >', -value => 'quit' }, ],); $cui->MainLoop; # a bez ktorej nic nie zadziala Zmiana polozenia kursora i kolorow do wykowania jest poprzez znak esc (\e) oraz odpowiedni kod sterujacy ansi:
printf "\e[%d;%dH;\e[3%dm%s", $y, $x, $kolor, $znak; gdzie $kolor ma wartosc 0-7, co odpowiada kolorom: czarny, czerwony, zielony, zolty, niebieski, fioletowy, blekitny, bialy.
Powrot kursora do poczatku linii (np. do nadpisania poprzedniej wartosci) mozna uzyskac:
printf "%20s [%02d%%] \r", $nazwa_pliku, $ile_procent; Ogolne informacje na temat kodow ansi: man console, man console_codes. Istnieja moduly Term::ANSI*:
use Term::ANSIColor; print color 'bold blue'; print "This text is bold blue.\n"; albo:
use Term::ANSIScreen qw/:constants/; # constants mode print BLUE ON GREEN . "Blue on green.\n"; 10.5. Jak wyczyscic ekran? Rozwiazanie nieprzenosne: polecenie 'system' z parametrem "cls" dla dos/win lub "clear" dla unices. Dla konsoli zgodnej z ansi: print "\e[2J\e[H";. Mozna tez print "\f\f" lub print "\n" x 24
11. Liczby 11.1. Jak zamienic liczbe dziesietna na binarna lub szesnastkowa? print unpack("B*",pack("N",$liczba)); # na bin print unpack ("H2", pack ("C", $dec)); # na hex printf "%x", $liczba; # na hex 11.2. A na inna podstawe? do { $wynik = chr(($reszta=$liczba % $podstawa) + ($reszta>9 ? 87:48)) . $wynik; } while ($liczba = int ($liczba / $podstawa)); print "$wynik\n"; Zamien 87 na 55 by litery byly duze.
11.3. A binarna na dziesietna? oct('0b'.$_); $a=reverse;$i=1;$_=0;$a=~s/./$_+=$i*$&,$i*=2/ge; $s=0;for(split//){$s*=2;$s+=$_}$_=$s; $s=0;($s*=2)+=$_ for/./g;$_=$s; s/./$s=$s*2+$&/ge;$_=$s; 11.4. Jak zamienic string na liczbe (i odwrotnie)? Nie trzeba, perl robi to automatycznie, odwrotnie rowniez.
Jesli ktos potrzebuje zapisac slownie liczbe, poleca sie
http://radek.karnet.pl/Number-SpellPolish-0.5.tar.gz 11.5. Czy ciag jest liczba? Sprawdzenie czy string jest liczba (same cyfry) w ogolnosci nie jest potrzebne, ale ...
$zmienna =~ /^\d+$/ Bardziej zaawansowane sprawdzenie:
$ciag =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/ 11.6. Jak zaokraglic liczbe? $liczba=int($liczba+0.5); #Zaokraglanie do czesci calkowitej $liczba=sprintf "%.2f",$liczba; #Zaokraglanie do 2 miejsc $liczba=int($liczba); #wyrzucenie po przecinku Przy zaokraglaniu funkcja typu printf, sprawdz czy o takie zakraglanie ci chodzi wpisujac ponizsze dwie linie (chodzi o zaokraglanie przy rownej odleglosci):
printf "%.0f", 0.5; printf "%.0f", 1.5; Oprocz funkcji int, sa jeszcze ceil i floor z modulu POSIX, dzialajace wedlug tabeli:
liczba int floor ceil 3.3 3.0 3.0 4.0 3.5 3.0 3.0 4.0 3.7 3.0 3.0 4.0 -3.3 -3.0 -4.0 -3.0 Funkcja ceil inaczej to:
int($x)==$x ? $x : int($x)+1 11.7. Jak poprawic format liczby? #Format po 3 cyfry $string=scalar reverse join " ",grep length,split /(\d{3})/,reverse $liczba; #Zamiast powyzszych 3 linii - dwa razy wolniej 1 while s/(.*\d)(\d{3})/$1 $2/; Mozna tez zastosowac modul Number::Format.
11.8. Jak policzyc cyfry w liczbie? W ogolnym przypadku dobrze jest skorzytac z funkcji logarytm dziesietny, na podstawie wbudowanej funkcji log (logarytm naturalny):
log10(x) = log (x) / log (10) W wiekszosci zastosowan zamiast int(log($x)/log(10)+1) mozna stosowac prostsza i szybsza konstrukcje (poza przedzialem (0,1) oraz zapisem typu 1e13):
length(int($x)) troche wolniejsza, lecz poprawna dla duzych liczb jest
length(sprintf "%.0f", $x) 11.9. Czy jest true/false? Nie ma, nalezy sobie zdefiniowac, przy czym zmienna, ktora jest pusta, niezdefiniowana, lub rowna wartosci 0 uznawana jest zawsze jako falsz, pozostale wartosci zmiennej to prawda.
use constant true => 1; use constant false => 0; 12. Wyrazenia tekstowe Na ten temat polecana jest ksiazka J. Friedla "Wyrazenia regularne" ("Mastering Regular Expressions") oraz manual perlre. Podstawy znajduja sie w "Programowanie Perl". Troche po polsku jest tez pod
http://ptm.linux.pl/man_HTML/info_pl_HTML/gawk/gawk_5.html#SEC27
Polecany tutorial mozna znalezc na
http://tutorials.boxsource.net/redirect.php?tutorialID=75
Zastosowania w innych srodowiskach opisuje
http://sitescooper.org/tao_regexps.html
12.1. Czy da sie uzyc zmiennej o zmiennej nazwie? Tak, jest to mozliwe, choc poleca sie stosowanie tablic. Np.: Zamiast ${"zmienna$nr"} czy $$nazwa_zmiennej lepiej uzyc $zmienna[$nr] http://perl.plover.com/varvarname.html
12.2. Jak porownac dwa ciagi znakow? Sluza do tego operatory =~, eq, ne, gt, lt, itp.
Do porownywania rozmytego - modul String::Approx.
12.3. Jak wylaczyc znaki specjalne? W wyrazeniu regularnym stosuje sie \Q i \E:
\Q$test\E Mozna tez uzyc funkcji quotemeta, poprzedzajacej kazdy znak znakiem backslash (\).
12.4. Jak wyciac spacje z przodu i konca? s/^\s*(.*?)\s*$/$1/; lub s/^\s*|\s*$//g; lub szybciej:
$string =~ s/^\s+//; $string =~ s/\s+$//; 12.5. Jak wyrzucic powtarzajace sie znaki? $tekst =~ tr///cs; lub
$tekst =~s/(.)\1+/$1/g; 12.6. Jak sprawdzic czy tekst ma dane litery? Jesli chcemy sprawdzic czy dany tekst zawiera inny:
$skalar =~ /$skalar2/ jesli nie zalezy nam na kolejnosci (tworzymy anagram):
$skalar =~ /[$skalar2]/ 12.7. Jak wyciagnac tekst z pliku HTML? Chodzi o pozbycie sie tagow HTML. Nalezy uzyc modulu HTML::Parser, lub mu pokrewnych (np. HTML::Entities).
use HTML::Parser; $p = HTML::Parser->new( text_h => [ sub { print $_[0] }, "dtext" ]); $p->parse_file("plik.html"); Alternatywa w prostszych przypadkach moze byc jedno z wyrazen.
$zmienna =~ s/<.*?>//g; $zmienna =~ s/<(?:[^>'"]*|(['"]).*?\1)*>//gs; 12.8. Jak wyciagnac linki z HTMLa? use HTML::LinkExtor; my $p=HTML::LinkExtor->new(); $p->parse_file($plik); foreach($p->links()) { print $_->[2]; } 12.9. Jak zamienic encje HTML? Przyklad
perl -MHTML::Entities -e 'print encode_entities("&"), "\n"' 12.10. Czym innym parsowac HTML? Modul HTML::TreeBuilder (HTML::Tree) ma ciekawy interfejs podobny do XML::TreeBuilder. Alternatywa to HTML::TokeParser.
12.11. Jak wyluskac tekst pomiedzy stringami? Sluzyc moze do tego (wyciaganie wielu linii) konstrukcja z operatorem zakresu (..):
/start/../koniec/ Do wyciagania z pliku wszystkiego pomiedzy litera b a f:
perl -ne 'print if /b/../f/' plik Kolejne teksty w cudzyslowach:
while ( m/"([^"]*)"/g ) { print $1; ## tutaj w $1 beda kolejne teksty w ciapkach } Bardziej ogolnie:
/START(.*?)END/s; print $1; 12.12. Jak znalezc i podmienic N-ty znak? substr($string,0,n)="b"; 12.13. Jak sformatowac tekst do N-tego znaku? Jesli N jest np. 80, a chcemy miec znaki tylko do N-tej kolumny, nie naruszajac wyrazow (linie moga konczyc sie wczesniej), to wtedy:
s/(.{0,80})\s+/$1\n/g 12.14. Czy w danym ciagu wystepuja tylko okreslone znaki? $ciag =~ tr/ABCDEFG//c Zwraca ilosc wystapien innych niz podane znaki. Czyli jezeli >0, to sa inne.
$ciag =~ /^[ABCDEFG]+$/ 12.15. Jak przeformatowac tekst (np. dla maila)? Sluzy do tego modul Text::Wrap, a takze Text::WrapProp i Text::Format;
12.16. Jak zakodowac string dla WWW (urlencoding)? s/([^\w\!*-])/sprintf("%%%02X",ord($1))/ge; lub z modulem CGI:
use CGI; $q=new CGI; $q->param(-name=>'nazwa',-value=>'wa //rte'); print $q->query_string; lub z modulem URI::Escape funkcja uri_escape()
12.17. Jak zakodowac/odkodowac stdin przez ROT-13 i wyswietlic? perl -pe 'tr/a-zA-Z/n-za-mN-ZA-M/' 13. Inne 13.1. Jak sprawdzic czas i date? Liczba sekund od 01.01.1970:
time Postac tekstowa lub wydzielona na poszczegolne pola:
localtime(time) lub po prostu localtime Postac tekstowa zalezna od jezyka z mozliwoscia konfiguracji:
use POSIX qw(strftime); $now_string = strftime "%a %b %e %H:%M:%S %Y", localtime; W jezyku polskim wystarczy dodac na poczatku
use locale; Bardziej poprawnie gramatycznie (bo w dopelniaczu):
($mday,$mon,$year) = (localtime)[3..5]; $todaydate = ($mday) . " " . (qw(stycznia lutego marca kwietnia maja czerwca lipca sierpnia wrzesnia pazdziernika listopada grudnia))[$mon] . " " . ($year+1900); Pozyteczne funkcje do czasu (daty) sa w modulach Time::ParseDate, Date::Calc, Date::Parse oraz Date::Manip.
Funkcja odwrotna do localtime to timelocal:
use Time::Local; $liczbasek = timelocal($sek,$min,$godz,$dzien,$mies,$rok); Do operacji na czasie w milisekundach sluzy modul Time::HiRes.
13.2. Do czego sluzy my/local? Funkcja my sluzy do deklaracji zmiennej i nadanie jej bardzo lokalnego kontekstu (w przeciwnienstwie do local $zmienna, ktory jest lokalny nie do konca).
My ogranicza zasieg zmiennych bedacych jej argumentami do biezacego bloku funkcji eval{}, procedury lub zaimportowanego pliku.
Tak zadeklarowane zmienne sa z reguly ciut szybsze niz normalne - globalne.
13.3. Jak wygenerowac salt? $salt = join '',('A'..'Z','a'..'z','0'..'9','.','/')[rand 64,rand 64]; 13.4. Jak zamienic bin na hex? $text = join "", unpack "H*", $text; 13.5. Ile moze zajmowac pamieci zmienna, tablica, hash? W perlu mozna zuzyc cala dostepna pamiec (lacznie z plikiem wymiany), o ile nie ma ograniczen systemowych.
13.6. Jak wyrzucic duplikaty z tablicy? Tworzac hash, ktorego kluczami sa wartosci tablicy.
@a = grep !$x{$_}++, @a; #lub @a = keys %{ { map { $_, 0 } @a } }; W drugim przypadku tablica moze zmienic kolejnosc elementow.
13.7. Czy w tablicy jest dana wartosc? Za pomoca funkcji grep:
@znalezione = grep {$szukana eq $_} @tablica; lub robiac sobie hash z wartosciami tablicy (patrz duplikaty w tablicy).
@hash{@tablica} = (1)x(scalar(@tablica)); if ($hash{$szukana}) { print "jest\n"; } 13.8. Jak pomieszac tablice (losowo)? for $i(1..$#a) { unshift @a,splice(@a,$i+rand($i),1) } lub
while(@a) {push @b, splice(@a,1+rand(@a),1)}; @a=@b; 13.9. Jak zamienic hash na tablice i odwrotnie? W tablicy kolejne elementy to klucz, wartosc, klucz, wartosc, itd:
%hash = @tablica; Dwie tablice (klucze,wartosci):
@hash{@klucze}=@wartosci; lub
%hash = map { ( $klucze[$_] => $wartosci[$_] ) } 0..$#wartosci; albo piszac w sposob zrozumialy:
for (0..$#wartosci) { $hash{$klucze[$_]} = $wartosci[$_]; } 13.10. Jak pozamieniac teksty wedlug hash'a (tlumaczyc)? Nalezy stworzyc sobie hash (slownik zamian) na przyklad polski <-> angielski:
my %p2a, %a2p,$pol,$ang; while(($pol=<>)) { chomp $pol; $ang = <>; chomp $ang; $a2p{$ang} = $pol; $p2a{$pol} = $ang; } A nastepnie zamienic:
$wzorzec = join('|',keys %a2p); #wykaz slow do zamiany $test =~ s/\b($wzorzec)\b/$a2p{$1}/g; #zamiana 13.11. Czy mozna posortowac hash'a (tablice asocjacyjna)? Tablica asocjacyjna z definicji nie moze byc posortowana, mozna natomiast stworzyc posortowana liste kluczy.
Sortowanie wedlug klucza:
@klucze = sort keys %hash; lub sortowanie weglug wartosci:
@klucze = sort { $hash{$a} <=> $hash{$b} } keys %hash; Uwaga: jesli wartosci sa napisami, nalezy uzyc cmp zamiast <=> sprawdzenie posortowania:
foreach (@klucze) {print "$_ => $hash{$_}\n";} Mozna tez przyjrzec sie Tie::IxHash.
13.12. Czym obsluzyc porty szeregowe? Device::SerialPort (lub POSIX::Termios do terminali) na uniksach i Win32::SerialPort na tym drugim.
13.13. Jak wczytac jeden klawisz? Mozna uzyc Term::ReadKey, np. z czasem oczekiwania 10 sekund:
use Term::ReadKey; my $key = ReadKey(10); 13.14. Jak zakomentowac wiekszy fragment? Przydatne jest tu stosowanie elemetow POD-a:
=tu start komentarza komentarz koniec =cut 13.15. Jak stworzyc modul (package)? Modul to inaczej pakiet lub biblioteka. Ogolnie konstrukcja jest nastepujaca (plik Test.pm):
package Test; use potrzebny_modul; sub moja_funkcja { return "Jest OK"; # slowo return jest tu zbedne } 1; Dostep do argumentow wywolania tradycyjnie przez wektor @_, przy czym element o indeksie 0, posiada referencje do pakietu
Wywolanie funkcji musi sie odbywac w odniesieniu do pakietu:
Test::moja_funkcja(); lub
use Test; $zwrot=Test->moja_funkcja; # w zmiennej zwrot bedzie "Jest OK" Jezeli jednak chcesz zeby Twoj pakiet udostepnial jakies zmienne/funkcje bezposrednio w pakiecie w ktorym zostal uzyty (zwykle - w pakiecie main), wtedy wlasnie uzywasz Exportera. Powoduje on, ze to co podasz w tablicy @EXPORT jest w trakcie wykonywania use Modul; eksportowane, czyli jest tworzone cos w rodzaju aliasu wskazujacego na nazwe w Twoim pakiecie.
I np. jezeli napiszesz na poczatku programu use POSIX, to modul POSIX *wyeksportuje* nazwe strftime() (i wiele innych), czyli jezeli pozniej uzyjesz funkcji strftime() to tak naprawde zostanie wywolana funkcja POSIX::strftime().
Przydatne manuale: perlmod i perlmodlib, oraz perlboot, perltoot, perltootc, perlobj, perlbot (w takiej kolejnosci)
13.16. Jak czytac pliki konfiguracyjne? Poleca sie modul Config::General. Czyta, parsuje i zapisuje pliki w stylu konfiguracji Apache'a. W prostszych zastosowaniach wystarcza Config::Tiny.
13.17. Jak porownac szybkosc kodu? Do tego celu stworzono modul Benchmark:
use Benchmark qw(cmpthese); cmpthese($ile_razy, { 'nazwa1' => sub { ...kod1... }, 'nazwa2' => sub { ...kod2... }, }); 13.18. Gdzie jest skrypt do DVD? 7 linijek, 526 znakow:
http://www.wired.com/news/culture/0,1284,42259,00.html?tw=wn20010307 $_='while(read+STDIN,$_,2048){$a=29;$b=73;$c=142;$t=255;@t=map{$_%16or$t^=$c^=( $m=(11,10,116,100,11,122,20,100)[$_/16%8])&110;$t^=(72,@z=(64,72,$a^=12*($_%16 -2?0:$m&17)),$b^=$_%64?12:0,@z)[$_%8]}(16..271);if((@a=unx"C*",$_)[20]&48){$h =5;$_=unxb24,join"",@b=map{xB8,unxb8,chr($_^$a[--$h+84])}@ARGV;s/...$/1$&/;$ d=unxV,xb25,$_;$e=256|(ord$b[4])<<9|ord$b[3];$d=$d8^($f=$t&($d12^$d4^ $d^$d/8))<<17,$e=$e8^($t&($g=($q=$e14&7^$e)^$q*8^$q<<6))<<9,$_=$t[$_]^ (($h=8)+=$f+(~$g&$t))for@a[128..$#a]}print+x"C*",@a}';s/x/pack+/g;eval 13.19. Ile kosztuje skrypt w Perlu? Wiekszosc skryptow dostepna jest bezplatnie (p. rozdzial drugi), lecz sa one dobre w typowych zastosowaniach. Niekiedy konieczne jest ich dostosowanie, lub wrecz przepisanie. Najlepiej wtedy oszacowac potrzebny czas i na tej podstawie wyceniac skrypty.
13.20. Co to jest golf? Jest to konkurs pl.comp.lang.perl - golf. Zwyciezca kazdej edycji konkursu (golfa) jest osoba, ktorej uda sie napisac program realizujacy zadana funkcje w minimalnej liczbie znakow. Trwa zazwyczaj tydzien. Na grupie podaje sie swoje wyniki, a rozwiazanie przedstawia po zakonczeniu konkursu.
Niedozwolone jest: wykorzystywanie modulow nie nalezacych do standardowej dystrybucji perla, wykorzystywanie funkcji dzialajacych tylko w okreslonym otoczeniu, wykorzystywanie wiedzy innych.
Liczba znakow liczona jest bez sciezki do perla (#!.*perl). Tiebreaker to dodatkowa puktacja przy tej samej liczbie. Ostateczny wynik podaje sie odzielajac kropka (np. 99.61). Przy tych samych wynikach decyduje kolejnosc zgloszen.
Odsylacze:
http://kernelpanic.pl/perlgolf-list.mx [pclp #4 i dalsze] http://www.ceti.pl/~kompas/golf/ [pclp #3] http://golf.negativeiq.pl/ [pclp #1 i #2] http://www.xs4all.nl/~thospel/golf/rules.html [ogolne reguly] http://perlgolf.sourceforge.net/ [rozwiazania] http://terje.dev.webon.net/golf/ [rozwiazania] http://perlmonks.org/index.pl?node=Obfuscated%20Code [rozwiazania] http://archive.develooper.com/golf@perl.org/ [dyskusje] 13.21. Jak rozszyfrowac niezrozumialy zapis? Problem dotyczy sygnaturek oraz rozwiazan golfa. Mozna to zrobic uruchamiajac problematyczny kod programu w jeden z nastepujacych sposobow.
perl -MO=Deparse -e 'kod' perl -MO=Deparse skrypt.pl 13.22. A jak go zrobic? Patrz do golfa albo na modul Acme::EyeDrops.
|
|
|