knowledge-database (beta)

Current group: pl.answers

FAQ pl.comp.lang.perl FAQ cz. 1 (290)

FAQ pl.comp.lang.perl FAQ cz. 1 (290)  
Krzysztof Juszkiewicz
 FAQ pl.comp.lang.perl FAQ cz. 2 (290)  
Krzysztof Juszkiewicz
 FAQ pl.comp.lang.perl FAQ cz. 3 (290)  
Krzysztof Juszkiewicz
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:




a w Perlu:

use CGI;
$query = new CGI;
$fh = $query->upload('uploaded_file'); # nazwa pliku
#$fh = $query->param('uploaded_file'); # dla starszych wersji
#typ zawartosci pliku:
$type = $query->uploadInfo($fh)->{'Content-Type'};
#naglowek:
print $query->header(-type=>$type);

#wypisanie pliku na ekran:
while (<$fh>) { print; }

Niekiedy moze byc potrzebne uzycie konstrukcji

use CGI qw(-private_tempfiles);

a takze ustawienie binmode OUTFILE. Dane charakterystyczne mozna dostac:

%hash=%{$dane->uploadInfo($file)};
foreach (keys(%hash)) {print "$_ -> $hash{$_}\n"};

Przed zbyt duzymi uploadami dobrze jest sie zabezpieczyc przez:

$CGI::POST_MAX=$ile_bajtow;

4.8. Jak sciagnac plik z okreslonego odniesienia URL?
Za pomoca modulu LWP (perldoc lwpcook):

use LWP::Simple;
if ($tekst_strony = get('http://serwer/sciezka/plik'))
{ print "udalo sie sciagnac plik"; }
else { print "nie udalo sie sciagnac pliku"; }

lub bardziej rozbudowana metoda:

use LWP::UserAgent;
$ua = new LWP::UserAgent;
#ustawienie czego
my $req = new HTTP::Request(GET => 'http://serwer/sciezka/plik');
$ua->credentials("serwer:80","Areajakastam","user","haslo"); #jesli na haslo
#sciagniecie
my $res = $ua->request($req);
#wypisanie
if ($res->is_success) { print $res->content; }
else {print $res->error_as_HTML; }

4.9. Jak wyslac wypelniony formularz (metoda POST)?
use HTTP::Request::Common qw(POST);
use LWP::UserAgent;
$ua = LWP::UserAgent->new;
my $req = POST 'http://www.perl.com/cgi-bin/BugGlimpse',
[ search => 'www', errors => 0 ];
print $ua->request($req)->as_string;

4.10. Czego uzyc do zaawansowanych sciagan?
Poleca sie modul LWP::RobotUA, WWW::Robot lub WWW::Mechanize:

my $www = new WWW::Mechanize;
$www->get('http://search.cpan.org');
$www->follow_link( text_regex => qr/jakies wyrazenie regularne/i );

Mozna takze wykorzystac modul IO::Socket, nalezy przy tym znac protokol
HTTP.

use IO::Socket;
$misie=IO::Socket::INET->new(PeerAddr => "server.com", PeerPort => 80,
Timeout => 1, Proto => 'tcp');
$misie->print("GET /sciezka/plik HTTP/1.0\n\n");
while(<$misie>) { print; }

Alternatywa moze tez byc Net::HTTP.

Dla obslugi https (HTTP+SSL) trzeba zainstalowac OpenSSL, a nastepnie
modul Net::SSLeay lub Crypt::SSLeay.

4.11. Czy sa biblioteki do FTP?
Do protokolu ftp uzywa sie modulu Net::FTP, wlaczonego wraz z obsluga
innych protokolow do biblioteki netlib.

$ftp = Net::FTP->new("some.host.name", Debug => 0);
$ftp->login("anonymous",'me@here.there');
$ftp->cwd("/pub");
$ftp->get("that.file");
$ftp->quit;

4.12. Czy mozna przekierowac przegladarke na inny URL?
Jest to mozliwe jedynie przy uzyciu metody GET. W tym celu nie nalezy
wysylac naglowka z linia Content-type, a trzeba z linia Location. Modul
CGI ma funkcje redirect.

4.13. A co z ciastkami (cookies)?
Odbieranie:

use CGI::Cookie;
my $zmienna;
my %cookies = fetch CGI::Cookie; # hash z ciastkami
if ( defined($cookies{'nazwa_ciacha'}) ) # jesli jest o tej nazwie
{ $zmienna = $cookies{'nazwa_ciacha'}->value; } # sprawdz wartosc

$cookie = $ENV{'HTTP_COOKIE'}; #zwraca wszystkie ciacha dla domeny

lub po prostu

use CGI;
$q = new CGI;
$zmienna = $q->cookie('nazwa_ciacha');
%answers = $query->cookie('answers');

Wysylanie:

use CGI qw/:standard/;
use CGI::Cookie;

$ciastko1 = new CGI::Cookie(-name => 'Liczba',-value => '2');
$ciastko2 = new CGI::Cookie(-name => 'Name',-value => 'Michal');

print header(-cookie=>[$ciastko1,$ciastko2]);
# Uwaga: trzeba to wyslac przed wlasciwa trescia strony!!!

Inny modul to HTTP::Cookies:

use HTTP::Cookies;
use LWP::UserAgent;

my $ua = LWP::UserAgent->new;
my $cookie_jar = HTTP::Cookies->new;
$ua->cookie_jar($cookie_jar);

Nie da sie na przyklad wyslac cookie przez skrypt uruchamiany jako SSI.

4.14. Jak identyfikowac ogladacza WWW?
Chodzi o mechanizm sesji i stosuje sie tu albo cookies, albo do URL
dokleja identyfikator (cos w stylu "&id=564534").

4.15. Czy jest wbudowany mechanizm sesji?
Sluzy do tego modul Apache::Session.

4.16. Jak wyslac po sobie kilka stron?
Chodzi o technike wysylania wielu stron przez serwer bez powtarzania
zadan ze strony przegladarki. Nalezy uzyc modulu CGI::Push.

4.17. Co to sa wstawki SSI i jak ich uzywac?
Apache i wiekszosc innych serwerow WWW pozwala wlaczac w tresc stron WWW
wyniki dzialania skryptow CGI znajdujacych sie na lokalnym serwerze.
Jezeli uzywamy apache'a w pliku ".htaccess" lub httpd.conf winny byc
nastepujace linie:

AddType text/html .shtml
AddHandler server-parsed .shtml

lub (w starszych wersjach Apache'a)

AddType text/x-server-parsed-html .shtml

oraz (dla pliku httpd.conf w zasiegu sekcji /sciezka/do/katalogu>)

Options +Includes +ExecCGI

Dzieki nim (opcja Includes) Apache bedzie przegladal pliki o
rozszerzeniu ".shtml" w poszukiwaniu tagow typu



To, co wygeneruja wywolane przez SSI skrypty nie jest juz
interpretowane: wywolan SSI nie mozna zagniezdzac.

Istnieja dwie zasadnicze metody odwolywania sie do SSI: exec i include.
Ta druga jest zalecana: jest bezpieczniejsza, a skryptom wywolywanym
(dzieki opcji ExecCGI) w ten sposob mozna przekazywac parametry
bezposrednio, poprzez URL np.



Aby przekazac parametry do SSI nalezy napisac plik.shtml?param=wart
Dzieki tej formule wszystkie parametry powinny byc widoczne we
wszystkich odwolaniach SSI. Parametry beda rowniez widoczne po ich
ustawieniu w kodzie HTML tagiem



Wiecej informacji w dokumentacji do Apache np.
http://sunsite.icm.edu.pl/pub/www/apache/docs/mod/mod_include.html

4.18. Jak uruchamiac CGI pod DOS/Windows?
W pierwszej linijce skryptu ma byc #!/Perl/bin/perl, o ile perl.exe jest
w sciezce do wykonywania, co mozna sprawdzic piszac w linii komend

perl.exe skrypt.pl

Inna wersja to #!C:\perl\bin\perl.exe -w lub #!C:\perl\bin\wPerl.exe

Zobacz tez punkt o testowniu skryptow.

4.19. Jak automatycznie wypelnic formularz?
http://www.stonehenge.com/merlyn/WebTechniques/col43.html

4.20. Jak pisac licznik?
open( F, "+<$czas.dat" ) or die "open: $!";
my $l = ;
seek F, 0, 0;
print F ++$l;
close F;

Nalezy takze uwzglednic zagadnienie rownoczesnosci dostepu poprzez
ograniczanie dostepu do pliku (patrz dzial pliki).

4.21. Jak pisac ksiazke gosci?
1. Skorzystanie z metody POST

2. Jesli wpisy do ksiegi gosci pojawiaja sie na stronie juz w postaci
gotowego pliku html'a (strona nie jest generowana w locie na podstawie
bazy danych) to sprawdz koniecznie ustawienie serwera czy nie jest on
parsowany (AddHandler server-parsed "tu rozszerzenie pliku z ksiega
gosci"). Jesli tak, to np. jakis wesolek jako wpis wstawi wredna
dyrektywe SSI i "obejrzy sobie swoj wpis w ksiazce". To co zobaczy
zalezy od pomyslowosci autora i stopnia zabezpieczenia serwera, ale na
pewno nie bedzie to wpis.

3. Uwaga jesli wpisy staja sie w pewnym miejscu skryptu parametrami
polecen systemowych.

4. Uwaga jesli wpisy staja sie w pewnym miejscu skryptu chocby
fragmentami sciezek do plikow. (3 i 4 - naprawde niebezpieczne gdy
skrypt chodzi z wyzszymi uprawnieniami niz nobody)

5. Sprawdzenie wielkosci przesylanych danych - to chyba oczywiste

6. Sprawdzenie wpisow pod katem zawartosci tagow html'owych (i ich
zamiana)

4.22. Jak wykonac zadania systemowe przez WWW?
Nalezy tu zwracac szczegolna uwage na bezpieczenstwo. Mozna to
zrealizowac nastepujaco. Dane z formularza wysylane sa do skryptu w
perlu, ktory z tych danych robi plik tymczasowy. Potem co np. 5 minut
uruchamia sie z crona drugi skrypt (man crontab), ktory czyta dane z
plikow i wykonuje zadane prace. W pelni bezpieczne rozwiazanie (tylko
ten drugi skrypt dziala z uprawnieniami roota). Frazy kluczowe:
wwwadduser, TACACS, RADIUS.

4.23. Co to jest mod_perl?
Modperl to po prostu kompilator/interpreter perla wbudowany w serwer
HTTP. Jezeli uzywasz CGI w perlu, to przy kazdym pobraniu strony serwer
musi uruchomic perla (jako zewnetrzny program), ktory wczytuje skrypt,
kompiluje i wykonuje. Jezeli uzywasz zamiast tego modperla, wtedy serwer
(tzn. ten wbudowany w serwer perl) od razu wczytuje skrypt. Malo tego -
po skompilowaniu zwykle trzyma sobie taka wersje w pamieci i tylko
wykonuje - wiec dziala to znacznie szybciej.

Mod_perl polega wlasnie na tym, ze skrypt jest uruchamiany raz, a potem
kolejne zapytania obsluguje "w petli". Jezeli gdzies otwierasz
polaczenie do bazy, to zostanie ono otwarte. Jezeli gdzies cos
bindujesz, to pozostanie zbindowane. Piszac pod mod_perla nalezy o tym
pamietac i robic na koncu swojego skryptu "porzadki", tak zeby kolejne
wywolanie moglo poprawnie dzialac.

Przy uzyciu modperla nie tylko mozesz pisac szybkie CGI, ale tez robic
znacznie wiecej - za posrednictwem specjalnego API masz dostep do
"bebechow" serwera HTTP (tzn. Apache). Sluzy tez do pisania modulow do
Apacha w perlu. Mozesz uzyc np. Apache::Registry - i wtedy piszesz
normalne CGI (przy uzyciu modulu CGI albo dowolnego innego do
standardowych CGI), tyle ze jest ono uruchamiane przez modperla wiec
dziala znacznie szybciej (odpada czas kompilacji) - 20 do kilkuset razy.

Mod_perl lubi byc pamieciozerny, co przy wielu jednoczesnych serwerach
Apache bywa czesto problemem.

Instalacja: http://perl.apache.org/guide/install.html
http: //www.pckurier.pl/archiwum/artykuly/kozinski_maciej/2001_03_74/list4.asp
Dokumentacja: http://perl.apache.org/ Apache z mod_perl i in.:
http://www.apachetoolbox.com/

perldoc Apache, Apache::Registry, Apache::PerlRun

4.24. Jak zaczac z FastCGI?
Dziala ono w punktu widzenia perla podobnie do mod_perla.

Do serwera WWW musi byc dolaczony modul FastCGI. W pliku httpd.conf
musi byc linia np.: AddHandler fastcgi-script .fcgi, dzieki temu
wszystkie skrypty z rozszerzeniem fcgi powinny byc wykonywane przez
FastCGI.

Skrypty FastCGI nieco roznia sie od zwyklych CGI. Musisz stosowac modul
FCGI (lub jakas "nakladke" na niego).

W FastCGI jest tak: serwer wczesniej uruchamia skrypt CGI, ktory jest
napisany w specjalny sposob, po wykonaniu inicjalizacji otwiera gniazdko
i oczekuje na polecenia. W momencie gdy przyjdzie request obslugiwany
przez ten skrypt, serwer laczy sie ze skryptem, przesyla mu parametry i
czeka na odpowiedz.

Dzieki temu, po pierwsze znika nam czas potrzebny na uruchomienie perla,
wczytanie i skompilowaniu skryptu, po drugie - mozemy wykonac
czasochlonne operacje (jak np. polaczenie do bazy) w czesci
inicjalizacyjnej.

Najprosciej zmienic wszedzie w programie CGI na CGI::Fast. Ale to
niespecjalnie przyspieszy dzialanie programow. Zeby to mialo sens,
trzeba skrypt przepisac tak:

#!/usr/bin/perl
use CGI::Fast;

# tutaj inicjalizacja - to co wystarczy zrobic raz
$dbh = DBI::connect ...
$sth = $dbh->prepare( "SELECT ... WHERE x = ?" );

while( my $q = new CGI::Fast ) {
# A tutaj obsluga kazdego kolejnego requestu, np.:
print "Content-type: text/plain\n\n";
print "OK\n";
}

W momencie gdy przychodzi nowy request do serwera HTTP skrypt zazwyczaj
jest juz w miejscu "new CGI::Fast" wiec moze bardzo szybko obsluzyc
zapytanie. Ponowne przejscie do tego warunku w petli powoduje najpierw
zakonczenie poprzedniego requestu i wyslanie wynikow do przegladarki, a
nastepnie oczekiwanie na kolejny request.

Jak widac, requesty sa kolejkowane i obslugiwane sekwencyjnie. W
praktyce mozna konfigurowac serwer tak, aby uruchamial wiecej niz jeden
proces FastCGI, w ten sposob mozemy obsluge bardziej "zrownoleglic".

4.25. Jak polaczyc Perla z HTML-em?
Dobrym pomyslem jest wykorzystanie mod_perla oraz jakiegos modulu.
Najczesciej uzywanym jest chyba HTML::Template oraz dosc zaawansowany
HTML::Mason. Inne (choc na pewno nie wszystkie) to: HTML::EmbPerl,
HTML::EP, HTML::DynamicTemplate, CGI::FastTemplate, Taco::Template,
Text::BasicTemplate, Text::Template, Text::SimpleTemplate oraz
Template::Toolkit (podobno dosc przyjemny).

Przeglad szablonow dostepny jest pod adresem
http://perl.apache.org/features/tmpl-cmp.html

Przyklad template.tmpl:



<TMPL_VAR NAME=title>








i fragment kodu w perlu:

use HTML::Template;

$tmpl = new HTML::Template(filename => "template.htmp")
$tmpl->param(title => "Test");
$tmpl->param(descr => "Testowa strona");
$tmpl->output();
$tmpl->clear_params();

5. Poczta
5.1. Jak wysylac maila?
Wyslac maila mozna za pomoca komendy (send)mail [moze byc dluzej
dostarczana, nie trzeba lacza do sieci w danym momencie] lub za pomoca
protoklu SMTP [trzeba sprawdzac stan lacza oraz status wykonan, nie
trzeba zewnetrznych programow, chociaz mozna laczyc sie z localhost, o
ile dziala serwer poczty].

Nalezy przy tym pamietac, ze znak @ odnosi sie do wektorow. Adresy
nalezy pisac w formie "osoba\@firma.com" lub 'osoba@firma.com'.

Dla Windows jest Blat for Windows NT(2000) (na 9x tez powinien dzialac,
lecz autorzy tego nie gwarantuja). http://blat.freeshell.org/

Jest takze Sendmail dla Windows http://www.indigostar.com/sendmail.htm

Blat jest freeware. Na 30-dni jest sendmail z Indigo.

smtpsend:

http://www.swsoft.co.uk/smtpsend/readme.txt
http://www.swsoft.co.uk/index.asp?page=freesoftware

Mozna probowac modulu Win32::OLE i wysylac z MS Outlooka, czy innego
klienta windowsowego.

5.2. Jak uzyc komendy (send)mail do listu?
Uzycie komendy mail (lub mailx) jest prostsze, lecz daje mniejsze
mozliwosci zmian, a takze zalezne jest od komputera (zaleca sie
przeczytac mana):

open(MAIL,"|mail $dokogo"); #uruchomienie programu i potoku do pisania

alternatywnie powyzsza linie mozna zastapic jedna z dwoch ponizszych
(uwaga na sciezke do programu sendmail):

open (MAIL, "|/usr/lib/sendmail -f $odkogo -oi -t -- $dokogo")
|| die "sendmail: $!";
open (MAIL, "|/usr/lib/sendmail -t -oi") || die "sendmail: $!";

W przypadku stosowania formularza nalezy stosowac te ostatnia, gdyz do
zmiennej $dokogo mozna dopisac pare innych polecen, ktore niekoniecznie
chcemy wykonywac. Nadawce i odbiorce sendmail ustawia wtedy na podstawie
nastepnych linii, ktore sa:

print MAIL <<"END" ;
From: $odkogo
To: $dokogo
Subject: $temat

END
print MAIL "$tresc\n\n";
close (MAIL) or warn $! ? "Blad: $!" : "Blad ze statusem $?";

Modul Mail::Sendmail jest polecany jako zamiennik komendy sendmail.

5.3. A jak obsluzyc wysylanie przez SMTP?
Mozna tez skorzystac z modulu Net::SMTP:

use Net::SMTP;
$smtp = Net::SMTP->new('mailhost');

$smtp->mail($ENV{USER});
$smtp->to('postmaster');

$smtp->data();
$smtp->datasend("To: postmaster\n");
$smtp->datasend("\n");
$smtp->datasend("A simple test message\n");
$smtp->dataend();

$smtp->quit;

Inny modul do wysylania to Mail::Sender (patrz nizej).

5.4. Co z polskimi literami w poczcie?
Do polskich liter w naglowkach przyda sie modul MIME::Words (patrz
rozdzial o polkich znakach), a gdy litery sa w tresci, do naglowkow
treba dodac linie:

Mime-Version: 1.0
Content-type: text/plain; charset=ISO-8859-2
Content-transfer-encoding: 8bit

i oczywiscie literki kodowane w ISO.

5.5. Jak wyslac plik (binarny) jako zalacznik?
W przypadku wysylania plikow binarnych (np. gif) mozna sie posluzyc
modulem MIME z pakietu MIME-tools:

use MIME::Entity;

# Przygotowanie:
$top = build MIME::Entity Type =>"multipart/mixed",
From => "me\@myhost.com",
To => "you\@yourhost.com",
Subject => "Hello, nurse!";

# Czesc #1: dokument tekstowy:
attach $top Path=>"./testin/short.txt";

# Czesc #2: plik GIF:
attach $top Path => "./docs/mime-sm.gif",
Type => "image/gif",
Encoding => "base64";


# Wyslanie przez sendmail:
open MAIL, "| /usr/lib/sendmail -t -i" or die "open: $!";
$top->print(\*MAIL);
close MAIL or die "sendmail close:$!\n";;

Zamiast MIME::Entity niektorzy uzywaja MIME::Lite. Alternatywa dla
MIME-tools jest korzystajace z SMTP:

use Mail::Sender;
$sender = new Mail::Sender {smtp => 'mail.yourdomain.com',
from => 'your@address.com',
charset=>'ISO-8859-2'};
$sender->MailFile({to => 'some@address.com',
subject => 'Here is the file',
msg => "I'm sending you the list you wanted.",
file => 'filename.txt'});

lub

$sender->MailMsg({ to => "$USER", subject => "$EMAIL_TITLE",
msg => "$MESTEXT \n"});

bardziej ambitni moga chciec kodowac naglowki i tresc samodzielnie, co
nie jest polecane:

"Content-Type: Multipart/Mixed;\n";
"\tboundary=\"Boundary-=_yGgxxpkLoRellNMPapqfWkHOPkMC\"\n";
"MIME-Version: 1.0\n";

"\n\n--Boundary-=_yGgxxpkLoRellNMPapqfWkHOPkMC\n";
"Content-Type: application/x-msdownload;\n";
"\tname=\"$Plik\" \n";
"Content-Transfer-Encoding: base64\n";
"Content-Disposition: attachment; filename=\"$Plik\" \n";
"\n\n";

use MIME::Base64 qw(encode_base64);
while (read($File_Handle,$Bufor,60*57)) {
encode_base64($Bufor);
}#while

5.6. Jak odczytac poczte z zalacznikami?
Nalezy uzyc pakietu MIME::Tools, a w szczegolnosci MIME::Parser;

use MIME::Parser;
my $parser = new MIME::Parser;
$parser->decode_headers(1); # naglowki zgodnie z RFC-1522
$parser->output_dir("/tmp"); # plik tymczasowe do /tmp
$ent = $parser->parse(\*STDIN); # parsuj poczte
$temat=$ent->head->get('subject'); # ustal temat
$type=$ent->mime_type; # ustal typ
if($type =~ m|multipart/|i) { # jesli wieloczesciowa
$num_parts = $ent->parts; # liczba czesci
for($i=0;$i<$num_parts;$i++) { # znajdz ktora jest tekstowa
if(($part = $ent->parts($i))->mime_type =~ m|text/|i) {
$part->print_body; # wyswietl tekst
last;
}
}
} else { $ent->print_body(); } # wyswietl zwykla poczte
$parser->filer->purge; # usun pliki tymczasowe


5.7. Jak sprawdzic poprawnosc adresu e-mail?
Metody dajacej 100% pewnosci, poza wyslaniem, nie ma. Mozna probowac
laczyc sie na port 25 serwera i korzystac z komendy VRFY.

Modul Email::Valid sprawdza zgodnosc formatu z RFC 822 (zawiera
wyrazenie regularne z okolo 6000 znakami), oraz opcjonalnie czy jest
wpis MX w DNSie, dla danego adresu.

5.8. Jak znalezc adresy w pliku?
Adresy czytane sa z otwartego pliku z deskryptora PLIK i umieszczane w
tablicy @adresy funkcja push.

while () { push @adresy,(m|([\w\d\.]{1,}\@[\w\d\.]{1,})|ig); }

5.9. Jak odebrac poczte?
Najlatwiej przy pomocy protokolu POP3. Nalezy jednak liczyc sie z z
mozliwoscia przechwycenia hasla.

use Net::POP3;
$pop = Net::POP3->new('pop3.host');
$result = $pop->login ( $USER , $PASS );
if ($result eq undef) { print "Nie zalogowalem\n"; }
else { print "liczba postow w skrzynce: $result\n"; }
$pop->quit();

Alternatywa to modul Mail::POP3Client.

$pop = new Mail::POP3Client(USER=>"user", PASSWORD=>"haslo",
HOST=>"poczta.onet.pl");
$liczba_listow = $pop->Count();

6. Siec
6.1. Jak zamienic adres na inna forme?
Symboliczny na numeryczny:

use Socket;
print inet_ntoa(scalar(gethostbyname($name)));

lub odwrotnie (szczegolnie przydatne jesli serwer WWW nie ustawia
zmiennej REMOTE_HOST):

use Socket;
print gethostbyaddr (inet_aton("149.156.96.9"), AF_INET );

lub wykorzystac Net::hostent lub Net::DNS::Resolver

6.2. Czy podany adres IP jest poprawny?
use Regexp::Common 'net';
/^$RE{net}{IPv4}$/;

6.3. Jak sprawdzic czy adres/domena jest zajety/a?
ftp://sunsite.icm.edu.pl/pub/doc/nask-hostcount/

lub dzieki modulowi:

use Net::DNS;
$res = new Net::DNS::Resolver;

$domena = "cos.com.pl";

if ($res->search($domena,NS)) { print "domena $domena juz zarejestowana\n"; }
else { print "domena $domena wolna\n"; }

6.4. Jak wyslac sms?
Generalnie sa dwa sposoby - wyslanie maila oraz symulacja przegladarki.
Oto adresy:

plus: mailto:+486xxxxxxxx@text.plusgsm.pl
idea: mailto:50xxxxxxx@sms.centertel.pl lub jako LWP-przegladarka
era: LWP-przegladarka

Gotowe skrypty:

http://romke.info/sms/
http://ceti.pl/~miki/komputery/sms.html
http://black.env.pl/sms
http://www.sms.magikon.com.pl/
http://www.in.lublin.pl/miasto.pl.txt

W CPANie jest tez kilka gotowych modulow, jak np. Net::SMS::12Move,
Net::SMS::Genie, czy WWW::SMS.

6.5. Czy jest modul do NNTP (newsow)?
use Net::NNTP;
$nn=Net::NNTP->new("news.task.gda.pl"); # polaczenie z serwerem
$n = $nn->list(); # lista grup
$n=$nn->group("pl.rec.gry.komputerowe"); # zmiana grupy
$n=$nn->next(); # wyjecie artykulu

$head=$nn->head(); # jego naglowek
$article=$nn->article(); # caly artykul
$body=$nn->body(); # tylko tresc
print @$body; # wyswietl tresc

6.6. Jak postawic serwer na porcie?
use IO::Socket;
my $sock = new IO::Socket::INET(Proto => 'tcp',
LocalPort => 5000, Listen => 5) or die "Sock: $!";
while (my $acc = $sock->accept()) {
print $acc "Hej hej!\n"; # tu komunikacja
my $odp=<$acc>;
close $acc;
}

inny sposob:

# set up the socket SERVER, bind and listen ...
use POSIX qw(:sys_wait_h);

sub REAPER {
1 until (-1 == waitpid(-1, WNOHANG));
$SIG{CHLD} = \&REAPER; # unless $] >= 5.002
}

$SIG{CHLD} = \&REAPER;

while ($hisaddr = accept(CLIENT, SERVER)) {
next if $pid = fork; # parent
die "fork: $!" unless defined $pid; # failure
# otherwise child
close(SERVER); # no use to child
# ... do something
exit; # child leaves
} continue {
close(CLIENT); # no use to parent
}

Alternatywa sa moduly Net::Server oraz Net::Server::Fork.

package MyPackage;
use Net::Server;
@ISA = qw(Net::Server);

sub process_request {
open(IN,"/etc/motd");
while(){
chomp; print "$_\r\n";
}
close(IN);
}

MyPackage->run(port => 9999);

6.7. Jak obsluzyc protokol SMB?
Mozna posluzyc sie klientem Samby: Filesys::SmbClient lub
Filesys::SmbClientParser.

7. Polskie znaki
7.1. Jak uaktywnic polskosc?
Generalnie perl jest przystosowany do obslugi polskich znakow. By te
obsluge uaktywnic wystarczy zawrzec w kodzie linijke (opis: perldoc
locale):

use locale;

W niektorych systemach moze to nie wystarczyc trzeba wowczas dodac
linie:

#use POSIX qw(locale_h); # linia potrzebna przy trzeciej linii
use POSIX qw(setlocale);
#setlocale(LC_ALL,"pl_PL.iso88592");
setlocale(&POSIX::LC_ALL,"pl"); # drugi argument w zaleznosci od systemu

gdy i to nie pomaga, trzeba zapoznac sie z wynikiem komendy man
perllocale. Jesli skrypt w Perlu po ustawieniach zgodnie z manualem
nadal nie daje satysfakcjonujacych rezultatow istnieje mozliwosc, ze
jest to wina systemu operacyjnego (np. windows, HP-UX). Nalezy wowczas
go poprawic, lub tworzyc wlasne procedury.

Nieuaktywnienie polskich znakow moze skutkowac blednym dzialaniem
niektorych funkcji np. liczacych liczbe wyrazow, znakow, sortujacych
itp.

Obecnie wchodzi rowniez standard Unicode wraz z odpowiednimi modulami,
na przyklad do konwersji jest Unicode::Map:

use Unicode::Map();
use Unicode::String qw(utf8 utf16);

# Budujemy sobie obiekt do wypluwania wyniku
$str_latin2 = new Unicode::Map("ISO-8859-2");

$result = "tekst w UTF-8";
$result = utf8($result);
$result = $str_latin2->from_unicode($result->utf16);

Inny sposob:

use Unicode::MapUTF8 qw(to_utf8 from_utf8);
$txt = to_utf8( { -string => $txt, -charset => 'ISO-8859-2' } );
$txt = from_utf8( { -string => $txt, -charset => 'ISO-8859-2' } );

Alternatywa moze byc Encode.

7.2. Jak sortowac z polskimi znakami?
Do sortowania tablic sluzy funkcja sort (perldoc -f sort). Jako drugi
argument mozna podac jej funkcje sortujaca wprost kod lub referencje. Po
uaktywnieniu polskosci funkcja sort powinna uwzgledniac polskie znaki,
co sprawdzamy:

print +(sort grep /\w/, map { chr() } 0..255), "\n";

Sortowanie polskie mozna rowniez uzyskac stosujac (linia podzielona ze
wzgledu na czytelnosc):

$literki=join('',0..9,"A\241BC\306\DE\312",F..L,"\243MN\321O\323PQRS\246",
T..Z,"\254\257_a\261bc\346de\352",f..l,"\263mn\361o\363pqrs\266",
t..z,"\274\277");
@posortowane = sort cowieksze @niesortowane;

sub cowieksze {
@aa=split //,$a;
@bb=split //,$b;
while($aa[0] eq $bb[0] && $#aa+$#bb>=0) {shift @aa; shift @bb;}
return index($literki,$aa[0]) <=> index($literki,$bb[0]);
}

7.3. Jak zmienic wielkosc liter?
Do zamiany liter duzych na male w zmiennej sluzy funkcja lc, a
odwrotnie uc. Bez polskich liter pierwsza jest rownowazna wyrazeniu

tr/[A-Z]/[a-z]/;

zas po uzyciu locale (przy zalozeniu standardu ISO)

tr/[A-Z]/[a-z]/;
tr/\241\306\312\243\321\323\246\257\254/\261\346\352\263\361\363\266\277\274/;

Do zamiany tylko pierwszej litery na duza jest funkcja lcfirst,
odwrotnie ucfirst.

7.4. Jak poprawic polskie znaki?
Problem zazwyczaj dotyczy wpisywania znakow w standardzie CP1250,
zamiast ISO. Najprostszy sposob to zamiana polskich A, S, Z, a, s, z (w
calym pliku lub ciagu znakow [napisie]):

perl -pi -e 'tr/\245\214\217\271\234\237/\241\246\254\261\266\274/' plik
$napis =~ tr/\xA5\x8C\x8F\xB9\x9C\x9F/\xA1\xA6\xAC\xB1\xB6\xBC/;

Do pozbycia sie ogonkow sluzy formula:

tr/acelnoszzACELNOSZZ/acelnoszzACELNOSZZ/

lub para:

tr/\241\306\312\243\321\323\246\257\254/ACELNOSZZ/;
tr/\261\346\352\263\361\363\266\277\274/acelnoszz/;

Wykaz polskich kodowan (wartosci numeryczne znakow) jest pod adresem

http://www.ogonki.agh.edu.pl/plchars.html

Konwersja z UTF jest w dziale o aktywowaniu polskosci.

7.5. Jak odkodowac polskie znaki?
Problem wystepuje glownie przy czytaniu poczty. Zaleca sie korzystanie z
modulu do czytania poczty.

use MIME::Words qw(:all);
$decoded = decode_mimewords("wyb=?iso-8859-2?Q?=F3r zespo=B3?=u");

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.
   

Copyright © 2006 knowledge-database   -   All rights reserved