apv@i-connect.ru
мЮ CPAN == Comprehensive Perl Archive Network. Homepage CPAN -- http://www.cpan.org/ -- РЮЛ АЕПСР БЯЕ, ЯБЪГЮММНЕ Я ОЕПКНЛ. яНАЯРБЕММН ХЯУНДМХЙХ МНБЕИЬЕИ БЕПЯХХ ОЕПКЮ АЕПСР ХГ ТЮИКЮ http://www.perl.com/CPAN/src/latest.tar.gz (МЮ ЯЮЛНЛ ДЕКЕ Я www.perl.com ЯРНХР ПЕДХПЕЙР МЮ АКХФЮИЬХИ, ОН ЛМЕМХЧ www.perl.com, mirror).
рЮЛ ФЕ, ЦДЕ Х БЯЕ, НРМНЯЪЫЕЕЯЪ Й ОЕПКС -- МЮ CPAN. оНКМШИ ЯОХЯНЙ БЯЕУ ЛНДСКЕИ Х АХАКХНРЕЙ -- http://www.cpan.org/CPAN.html
еЯРЭ. оНКМШИ ЯОХЯНЙ ГЕПЙЮК МЮУНДХРЯЪ Б ftp://ftp.nluug.nl/pub/languages/perl/CPAN/MIRRORED.BY, РЮЛ ЛНФМН МЮИРХ funet ХКХ ВРН РЮЛ ОНАКХФЕ, ХКХ ДЮФЕ ПНЯЯХИЯЙХЕ ГЕПЙЮКЮ, МЮОПХЛЕП ftp://ftp.sai.msu.su/pub/lang/perl/CPAN/ (ХМНЦДЮ Б ДЮСМЕ).
нАШВМН ЛНДСКЭ ОПХУНДХР Б ТНПЛЮРЕ tar+gzip, РХОЮ module-0.01.tar.gz. бЮЛ МЕНАУНДХЛН ЕЦН ПЮГБЕПМСРЭ: tar zxf module-0.01.tar.gz Х ОЕПЕИРХ Б НАПЮГНБЮБЬСЧЯЪ ДХПЕЙРНПХЧ, МЮОПХЛЕП module-0.01: cd module-0.01 нАШВМН РЮЛ МЮУНДЪРЯЪ МЕЯЙНКЭЙН ТЮИКНБ. дКЪ БЮЯ АСДСР БЮФМШЛХ ЯКЕДСЧЫХЕ:
ВРН ЩРН ГЮ ЛНДСКЭ
ЙЮЙ ЕЦН ОНЯРЮБХРЭ
ОЕПКНБШИ ЯЙПХОР ДКЪ ЦЕМЕПЮЖХХ Makefile
нАШВМН ХМЯРЮККЪЖХЪ ОПНХЯУНДХР ЯКЕДСЧЫХЛ НАПЮГНЛ:
perl Makefile.PL
ЦЕМЕПЮЖХЪ Makefile
make all
ЯАНПЙЮ ЛНДСКЪ
make test
РЕЯРХПНБЮМХЕ ЛНДСКЪ
make install
ХМЯРЮККЪЖХЪ ЛНДСКЪ
мЕНАУНДХЛН БМХЛЮРЕКЭМН ЯЛНРПЕРЭ, МЕ БНГМХЙКХ КХ ЙЮЙХЕ НЬХАЙХ БН БПЕЛЪ ОЕПБШУ РПЕУ ЙНЛЮМД. бМХЛЮМХЕ: БШ ДНКФМШ ХЛЕРЭ ЮДЛХМХЯРПЮРХБМШЕ ОПХБХКЕЦХХ ДКЪ ХМЯРЮККХПНБЮМХЕ ЛНДСКЪ Б ЯХЯРЕЛЕ (НАШВМН ЙЮЙ root).
мН, ЕЯКХ БШ ХУ МЕ ХЛЕЕРЕ, РН ЛНФЕРЕ ХМЯРЮККХПНБЮРЭ ЛНДСКЭ С ЯЕАЪ. дКЪ ЩРНЦН БЮЛ МЕНАУНДХЛН БШАПЮРЭ, ЦДЕ ЩРН АСДЕР ДЕКЮРЭЯЪ. дКЪ ОПХЛЕПЮ, Б $HOME/lib/perl5. мЕНАУНДХЛН ЯНГДЮРЭ ЩРХ ДХПЕЙРНПХХ, ЕЯКХ ХУ МЕР:
mkdir ~/lib mkdir ~/lib/perl5гЮРЕЛ, ОПХ ЦЕМЕПЮЖХХ Makefile ДКЪ ЛНДСКЪ, БШ ДНКФМШ СЙЮГЮРЭ, ЦДЕ БШ УНРХРЕ ХМЯРЮККХПНБЮРЭ ЛНДСКЭ:perl Makefile prefix=$HOME бЯЕ НЯРЮКЭМШЕ ЬЮЦХ АЕГ ХГЛЕМЕМХИ. б ПЕГСКЭРЮРЕ БШ ОНКСВХРЕ ЮКЭРЕПМЮРХБМНЕ ЛЕЯРН, ЦДЕ С БЮЯ АСДСР МЮУНДХРЭЯЪ ЛНДСКХ. мЮОПХЛЕП, С ЛЕМЪ ЩРН БШЦКЪДХР РЮЙ:
artur@disco:~ (681) ls -alFg ~/lib/perl5/
total 704
drwxr-sr-x 8 artur staff 512 Oct 06 15:53 ./
drwxr-sr-x 9 artur staff 1024 Oct 08 10:50 ../
drwxr-sr-x 4 artur staff 512 Mar 31 1998 aix/
drwxr-sr-x 2 artur staff 512 Aug 06 13:40 CPAN/
-r--r--r-- 1 artur staff 126951 Jul 24 19:37 CPAN.pm
drwxr-sr-x 3 artur staff 512 Mar 31 1998 man/
drwxr-sr-x 31 artur staff 1024 Sep 09 15:41 site_perl/
дКЪ РНЦН, ВРНАШ ХУ ХЯОНКЭГНБЮРЭ, ЕЯРЭ МЕЯЙНКЭЙН ОСРЕИ:
perl -I$HOME/lib/perl5 -I$HOME/lib/perl5/site_perl script.pl
PERL5LIB=$HOME/lib/perl5:$HOME/lib/perl5/site_perlexport PERL5LIB ДКЪ csh (tcsh)
setenv PERL5LIB $HOME/lib/perl5:$HOME/lib/perl5/site_perl
use lib "/home/you/lib/perl5"; use lib "/home/you/lib/perl5/site_perl";дЮММШИ ЯКСВЮИ ОНДУНДХР Й CGI-ЯЙПХОРЮЛ, ЙНРНПШЕ МЕ МЮЯКЕДСЧР БЮЬХУ ОЕПЕЛЕММШУ НЙПСФЕМХЪ.
яЙЮВХБЮМХЕ Х СЯРЮМНБЙЮ БПСВМСЧ -- ДНЯРЮРНВМН ЯКНФМНЕ ГЮМЪРХЕ,
РПЕАСЧЫЕЕ ОНЯРНЪММНЦН БЛЕЬЮРЕКЭЯРБЮ Я БЮЬЕИ ЯРНПНМШ.
лНФМН ОПНЯРШЛ ЯОНЯНАНЛ: ЯДЕКЮРЭ su (ФЕКЮРЕКЭМН), ГЮОСЯРХРЭ
perl -MCPAN -e shell
. еЯКХ ЩРН ОЕПБШИ ГЮОСЯЙ ЛНДСКЪ CPAN,
БЮЛ ГЮДЮДСР ЯЕПХЧ БНОПНЯНБ МЮ РЕЛС URL БЮЬЕЦН КЧАХЛНЦН ГЕПЙЮКЮ CPAN. оНЯКЕ
ЩРНЦН БЯЕ ОПНЯРН: ЕЯКХ БШ ГМЮЕРЕ МЮГБЮМХЕ ЛНДСКЪ ХКХ АХАКХНРЕЙХ, РН
МЮАХПЮЕРЕ, ЯЙЮФЕЛ, install Net::NNTP
. рНЦДЮ ЩРНР ЛНДСКЭ (ДКЪ ПЮАНРШ Я
NNTP) ЯЮЛ ХЫЕРЯЪ МЮ CPAN, ЯЮЛ ЯЙЮВХБЮЕРЯЪ, ЙНЛОХКХПСЕРЯЪ,
СЯРЮМЮБКХБЮЕРЯЪ. бЯЕ, ОНЯРЮБХКХ, ЛНФМН БШУНДХРЭ Х ХЯОНКЭГНБЮРЭ БМНБЭ
СЯРЮМНБКЕММШИ ЛНДСКЭ. еЯКХ МЮГБЮМХЕ РНВМН МЕ ХГБЕЯРМН, РН МЮАХПЮЕЛ
РЮЛ ФЕ help Х ХЯОНКЭГСЕЛ ПЮГКХВМШЕ ЙНЛЮМДШ ОНХЯЙЮ РХОЮ i NNTP.
оПХ ХЯОНКЭГНБЮМХХ CPAN-ЛНДСКЪ БЮЛ МЕНАУНДХЛН ЯЙНМТХЦСПХПНБЮРЭ ЕЦН
РЮЙХЛ НАПЮГНЛ, ВРНАШ НМ ЯЮЛ ХМЯРЮККХПНБЮК ЛНДСКХ РСДЮ, ЙСДЮ БШ
СЙЮФЕРЕ. дКЪ ЩРНЦН БЮЛ МЕНАУНДХЛН ОНДПЕДЮЙРХПНБЮРЭ ТЮИК
~/.cpan/CPAN/MyConfig.pm:
СЙЮГЮРЭ Б ЯРПНЙЕ
&makepl_arg& =& q[prefix=/home/you],
Х РЕОЕПЭ БЯЕЦДЮ ОПХ ЮБРНЛЮРХВЕЯЙНИ ХМЯРЮККЪЖХХ ЛНДСКХ АСДСР ЯРЮБХРЯЪ Й
БЮЛ Б $HOME/lib/perl5
аНКЕЕ ОНДПНАМН НАН БЯЕЛ ЩРНЛ ЛНФМН ОПНВХРЮРЭ Б ДНЙСЛЕМРЮЖХХ Й
ExtUtils::MakeMaker.
NB: яНБПЕЛЕММШИ лНДСКЭ яPAN БЯЕ ЯЮЛ ЯОПНЯХР Х ЯДЕКЮЕР.
дБЕ ЙКЮЯЯХВЕЯЙХЕ ЙМХЦХ ОН ОЕПКС, ОЕПБЮЪ ХЛЕЕРЯЪ Б ПСЯЯЙНЛ ОЕПЕБНДЕ Х ОПНДЮЕРЯЪ Б ЛЮЦЮГХМЮУ:
пЮМДЮК ьБЮПЖ, рНЛ йПХЯРХЮМЯЕМ. хГСВЮЕЛ ОЕПК (aka Llama book)
кЩППХ сНКК, рНЛ йПХЯРХЮМЯЕМ, пЮМДЮК ьБЮПЖ. Programming Perl (aka Camel book, МЮ ПСЯЯЙНЛ, ЙЮФЕРЯЪ, ЕЫЕ МЕР)
Llama book - СВЕАМХЙ ДКЪ МЮВХМЮЧЫХУ, Camel book - ЯОПЮБНВМНЕ ПСЙНБНДЯРБН.
**New: еЯРЭ ЕЫЕ ПСЯЯЙХИ ОЕПЕБНД Perl Cookbook ОНД МЮГБЮМХЕЛ р. йПХЯРХЮМЯЕМ, м. рНПЙХМЦРНМ "Perl: аХАКХНРЕЙЮ ОПНЦПЮЛЛХЯРЮ" - яоА, хГДЮРЕКЭЯРБН "оХРЕП", 2000. ISBN 5-8046-094-X
х ЕЫЕ ЙМХФЙЮ: л. пЮИР Х ДП. "CGI/Perl". еЕ Ъ МЕ ПЕЙНЛЕМДСЧ, ЙЮЙ Х БЯЕ НР пЮИРЮ.
оЕПК ОПХУНДХР Я ОНКМШЛ МЮАНПНЛ ДНЙСЛЕМРЮЖХХ Х МЮАНПНЛ ОПНЦПЮЛЛ ДКЪ ОЕПЕБНДЮ Б ПЮГМШЕ ТНПЛЮРШ. нАШВМН ДКЪ ОНДПНАМНЦН НГМЮЙНЛКЕМХЪ Я МЕЙНРНПНИ НЯНАЕММНЯРЭЧ ОЕПКЮ ОХЬСР "perldoc perlЯБНИЯРБН" ХКХ "man perlЯБНИЯРБН". аЮГНБШИ МЮАНП "ЯБНИЯРБ" РЮЙНБ:
оЕПК ДКЪ win32 ОНЯРЮБКЪЕРЯЪ Я ОПНЦПЮЛЛНИ perldoc (ОНКЭГНБЮРЭЯЪ: "perldoc perlfunc" Х Р. Д.) Ю РЮЙФЕ Я ДНЙСЛЕМРЮЖХЕИ Б HTML: ЕЯКХ УНВЕЬЭ perldoc perlfunc, ХЫХ perlfunc.html.
тНПЛЮР ЯРЮМДЮПРМНИ ДНЙСЛЕМРЮЖХХ ОН ОЕПКС (pod) НАКЮДЮЕР
БНГЛНФМНЯРЭЧ БЯРПЮХБЮМХЪ ОПЪЛН Б РЕЙЯРШ ОПНЦПЮЛЛ, Ю ОПНЦПЮЛЛЮ perldoc
-- БНГЛНФМНЯРЭЧ ХГБКЕВЕМХЪ ЩРНИ ДНЙСЛЕМРЮЖХХ. оНЩРНЛС, ВРНАШ ОНКСВХРЭ
ДНЙСЛЕМРЮЖХЧ ОН ЛНДСКЧ Math::Trig
, ОПНЯРН ГЮОСЯРХРЕ perldoc Math::Trig
-- perldoc МЮИДЕР ЩРНР ЛНДСКЭ Х ОНЙЮФЕР ДНЙСЛЕМРЮЖХЧ ХГ МЕЦН. еЯКХ
ЛНДСКЭ МЕ ЪБКЪЕРЯЪ ВЮЯРЭЧ ЙЮЙНИ-РН АХАКХНРЕЙХ, Ю ЯСЫЕЯРБСЕР ЯЮЛ ОН
ЯЕАЕ, МЮОПХЛЕП, CGI.pm РНЦДЮ ОПНЯРН perldoc CGI.pm ХКХ ДЮФЕ perldoc
CGI. NB: ОПНЦПЮЛЛЮ perldoc МЕ НВЕМЭ ПЮЯРНПНОМЮ, ОНЩРНЛС ОПХ СЯРЮМНБЙЕ
ОЕПКЮ ОНД UNIX ОПНХГБНДХРЯЪ ЯНГДЮМХЕ manpages ДКЪ БЯЕУ ЛНДСКЕИ, РЮЙ
ВРН man CGI ХКХ man Math::Trig ОНЙЮФЕР АШЯРПЕЕ, ВЕЛ perldoc.
дЮ, НМ РНФЕ БУНДХР Б МЮАНП ЯРЮМДЮПРМНИ ДНЙСЛЕМРЮЖХХ. нРОПЮБМЮЪ РНВЙЮ -- perldoc perlfaq, ЩРН НЦКЮБКЕМХЕ, ХГ ЙНРНПНЦН ЛНФМН СГМЮРЭ, ВРН FAQ ЯНЯРНХР ХГ ДЕБЪРХ АНКЭЬХУ ВЮЯРЕИ.
оПН ЩРН ЦНБНПЪР Б perldoc perlpod, Б man pod2man.
дЮ. мЮ ЛНИ БГЦКЪД, ЯЕПХЪ ЯРЮРЕИ пЮМДЮКЮ ьБЮПЖЮ ДКЪ Unix Review Perl Columns -- КСВЬЕЕ ББЕДЕМХЕ Б ОЕПК, Х МЮЛМНЦН ХМРЕПЕЯМЕЕ Х ОНКЕГМЕЕ ЙМХЦ Llama Х Camel (ЛМЕМХЪ ЮБРНПНБ МЕ БЯЕЦДЮ ЯНБОЮДЮЧР Я ЛМЕМХЕЛ ЙННПДХМЮРНПЮ -- юЛЛНЯНБ). оНВХРЮРЭ ХУ ЛНФМН МЮ http://w3.stonehenge.com:80/merlyn/UnixReview/.
оНВЕЛС Ъ ЯВХРЮЧ ЩРН КСВЬХЛ ББЕДЕМХЕЛ Б ОЕПК? оНРНЛС ВРН ЩРН НРДЕКЭМШЕ МЕАНКЭЬХЕ ЯРЮРЭХ, ЙЮФДЮЪ ХГ ЙНРНПШУ ХККЧЯРПХПСЕР ЙНМЙПЕРМШЕ БНГЛНФМНЯРХ ОЕПКЮ МЮ ОПХЛЕПЕ МЮОХЯЮМХЪ ОПНЦПЮЛЛШ ДКЪ ДНЯРЮРНВМН ОПНЯРНИ ГЮДЮВХ. бЯЕ ФЕ ЯРЮРЭХ НУБЮРШБЮЧР ОПЮЙРХВЕЯЙХ БЕЯЭ ЯОЕЙРП БНГЛНФМНЯРЕИ ОЕПКЮ -- НР МЮОХЯЮМХЪ ЯЙПХОРЮ Б НДМС ЯРПНЙС, ЙНРНПШИ ЛНФЕР ОНЛЕМЪРЭ хБЮМНБ МЮ яХДНПНБ БН БЯЕУ ТЮИКЮУ Б ДЕПЕБЕ ДХПЕЙРНПХИ, ДН НЯМНБ НАЗЕЙРМН-НПХЕМРХПНБЮММНЦН ОПНЦПЮЛЛХПНБЮМХЪ Х ОПХМЖХОНБ ЯНГДЮМХЪ ЯНАЯРБЕММШУ ЛНДСКЕИ Х АХАКХНРЕЙ.
еЯКХ МЕР БНГЛНФМНЯРХ ЙСОХРЭ Б ЛЮЦЮГХМЕ, РН ЕЯРЭ ЙНЕ-ВРН Х Б хМРЕПМЕРЕ: ЙМХЦЮ лЮЯКНБЮ "бБЕДЕМХЕ Б ОЕПК", МЮОПХЛЕП. http://citforum.ru/koi/internet/perl_tut/ еЯРЭ Х ДПСЦХЕ, НЯНАН УНПНЬХУ МЕ БХДЕК.
man perlfunc ХКХ "perldoc -f ХЛЪ_ТСМЙЖХХ | pod2text"
я ОНЛНЫЭЧ РЮЙ МЮГШБЮЕЛШУ ТЮИКНБШУ РЕЯРНБ, ЙНРНПШЕ ХЛЕЧР БХД (-РЕЯР "ХЛЪ ТЮИКЮ"), МЮОПХЛЕП:
ПЮГЛЕП ТЮИКЮ
ЯСЫЕЯРБСЕР КХ ТЮИК
ДНЯРСОЕМ КХ МЮ ГЮОХЯЭ
ЙНКХВЕЯРБН ДМЕИ ЯН ДМЪ ЛНДХТХЙЮЖХХ
ЪБКЪЕРЯЪ КХ РЕПЛХМЮКНЛ
яОНЯНА ДКЪ Unix oР Alex Efros
open MAIL, '|/path/to/your/sendmail -t'; # Pipe Й sendmail
print MAIL "From: mailrobot@my.host\n",
"To: webmaster@my.host\n",
"Subject: Wow! I got some mail for you!!!\n\n",
$message;
close MAIL;
с ЛЕМЪ МЕ Unix! вРН ДЕКЮРЭ?
бЕПНЪРМН, бЮЛ ОНЛНФЕР ЛНДСКЭ Net::SMTP
бНГЭЛХРЕ МЮ CPAN ЛНДСКЭ MIME::Tools Х ОПНВРХРЕ НР МЕЦН README. (MIME-tools.xxxxx.tar.gz)
цЮПЮМРХПНБЮММН -- МХЙЮЙ. бШ ЛНФЕРЕ ОПНБЕПХРЭ ЮДПЕЯ МЮ ОПЮБХКЭМНЯРЭ ЯХМРЮЙЯХЯЮ ОПХ ОНЛНЫХ Email::Valid. х БЯЕ. еЯКХ МСФЕМ ЦЮПЮМРХПНБЮММН ОПЮБХКЭМШИ e-mail ДКЪ web-ЯЮИРЮ, БШ ЛНФЕРЕ БНЯОНКЭГНБЮРЭЯЪ ЛЕРНДНЛ НР юКЕЙЯЕЪ рСРСАЮКХМЮ: РПЕАНБЮРЭ ОЮПНКЭ ДКЪ ДНЯРСОЮ Й ХМТНПЛЮЖХХ, Ю ЯЮЛ ОЮПНКЭ БШЯШКЮРЭ ОН ЩКЕЙРПНММНИ ОНВРЕ. рНЦДЮ ВЕКНБЕЙ ДНКФЕМ АСДЕР СЙЮГЮРЭ ЯБНИ e-mail, ЙНМЕВМН ФЕ, ЕЯКХ ЕЛС ХМРЕПЕЯМЮ ЩРЮ ХМТНПЛЮЖХЪ Я БЮЬЕЦН ЯЮИРЮ.
оПНЯРЕИЬХИ ЯКСВЮИ:
яЮЛ ЛНДСКЭ ОПЕДЯРЮБКЪЕР ХГ ЯЕАЪ ТЮИК Я ХЛЕМЕЛ MyModule.pm
ЯКЕДСЧЫЕЦН ЯНДЕПФЮМХЪ:
MyModule.pm
package MyModule;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(ХДЕМРХТХЙЮРНПШ ДКЪ ЩЙЯОНПРЮ: ОНДОПНЦПЮЛЛШ, ХЛЕМЮ ОЕПЕЛЕММШУ Х
ОП.);
# рЕОЕПЭ ОНЯКЕ РНЦН, ЙЮЙ БШ МЮОХЬХРЕ use MyModule Б ЯБНЕИ ОПНЦПЮЛЛЕ, С БЮЯ БЯЕ
# СОНЛЪМСРШЕ ГДЕЯЭ ХДЕМРХТХЙЮРНПШ ЯРЮМСР БХДМШ. щРНР ЛЕРНД МЕ ПЕЙНЛЕМДСЕРЯЪ,
# РЮЙ ЙЮЙ БШ "ГЮЯНПЪЕРЕ" ХЛЕММНЕ ОПНЯРПЮМЯРБН ОПНЦПЮЛЛШ.
# х/ХКХ
@EXPORT_OK = qw(ХДЕМРХТХЙЮРНПШ ДКЪ ЩЙЯОНПРЮ: ОНДОПНЦПЮЛЛШ, ХЛЕМЮ ОЕПЕЛЕММШУ Х
ОП.);
# хДЕМРХТХЙЮРНПШ, ОПНОХЯЮММШЕ ГДЕЯЭ АСДСР БХДМШ Б бЮЬЕИ ОПНЦПЮЛЛЕ ЙЮЙ
# MyModule::хДЕМРХТХЙЮРНП (ОНДОПНЦПЮЛЛШ) ХКХ $MyModule::хДЕМРХТХЙЮРНП
# (ОЕПЕЛЕММШЕ)
# хКХ, бШ ЛНФЕРЕ МЮОХЯЮРЭ use MyModule qw(хД1 хД2 $хД3); Х БЯЕ АСДЕР ЙЮЙ Б
# ОЕПБНЛ ЯКСВЮЕ. щРН ПЕЙНЛЕМДСЕЛШИ БЮПХЮМР.
... БЮЬХ ОНДОПНЦПЮЛЛШ Х ОП ....
1; # нАЪГЮРЕКЭМН
оПНЦПЮЛЛЮ, ЕЦН ХЯОНКЭГСЧЫЮЪ:
myprg.pl
use MyModule qw(...);
# мС Х ДЮКЕЕ
оНДПНАМНЯРХ ЯЛНРПХРЕ Б perlmod(1), Exporter(3pm), Camel Book
мЮДН ХЯОНКЭГНБЮРЭ ТСМЙЖХЧ substr. мЮОПХЛЕП, ОНКСВХРЭ 15И ЯХЛБНК ХГ ЯРПНЙХ $string:
$char = substr($string, 15, 1);
сЯРЮМНБХРЭ 15И ЯХЛБНК ЯРПНЙХ $string:
substr($string, 15) = 'A';лНФМН ДЮФЕ ХЯОНКЭГНБЮРЭ АНКЕЕ ВЕЛ НДМНЯХЛБНКЭМШЕ ОНЯКЕДНБЮРЕКЭМНЯРХ:
$ss = substr($string, 15, 5); substr($string, 15) = 'уН-уН';
CGI -- Common Gateway Interface. яРЮМДЮПР ХМРЕПТЕИЯЮ БМЕЬМХУ ОПНЦПЮЛЛ Я http-ЯЕПБЕПНЛ.
HTTP -- ЙКХЕМР-ЯЕПБЕПМШИ ОПНРНЙНК, ЯКЕДНБЮРЕКЭМН ЯН ЯРНПНМШ CGI-ОПНЦПЮЛЛШ, ЙЮЙ ЯЕПБЕПМНЦН ОПНЖЕЯЯЮ, БЯЕ БГЮХЛНДЕИЯРБХЕ БШЦКЪДХР ЯКЕДСЧЫХЛ НАПЮГНЛ
оСМЙРШ 1 Х 3 Ъ БЙПЮРЖЕ НОХЬС ГДЕЯЭ, Ю 2, МЮДЕЧЯЭ, ЯДЕКЮЕРЕ ЯЮЛХ :-). мЮВМЕЛ Я О.3, ЙЮЙ МЮХАНКЕЕ ОПНЯРНЦН.
нАШВМН ЙКХЕМРС БШДЮЧР РЕЙЯР Б ТНПЛЮРЕ HTML (МХВРН МЕ ЛЕЬЮЕР бЮЛ НРОПЮБХРЭ ЕЛС Х ЙЮПРХМЙС/БХДЕН/etc). дКЪ РНЦН, ВРНАШ ЯЕПБЕП Х ЙКХЕМР БЮЯ ОНМЪКХ, МЕНАУНДХЛН ЯЙЮГЮРЭ, ВРН БШ БШДЮЕРЕ, c ОНЛНЫЭЧ ГЮЦНКНБЙЮ Content-Type: mime-type/mime-subtype. нАПЮРХРЕ БМХЛЮМХЕ МЮ ПЕЦХЯРП Х ОНЯКЕДНБЮРЕКЭМНЯРЭ -- ЕЯКХ БШ ЯЙЮФХРЕ МЕВРН РХОЮ Content_type, РН ЯЕПБЕП БЮЯ ЯЙНПЕЕ БЯЕЦН МЕ ОНИЛЕР. (яННАЫЕМХЕ РХОЮ "500 Internal Server Error" АСДЕР ЯХЛОРНЛНЛ).
оПХЛЕП:
print "Content-Type: text/html\n";
# лШ БШДЮЕЛ РЕЙЯР Б ТНПЛЮРЕ HTML. рЮЙФЕ ЛНФМН: text/plain -- ОПНЯРНИ РЕЙЯР, Б
# АПЮСГЕПЕ НРНАПЮГХРЯЪ ЮМЮКНЦХВМН РЕЙЯРС, ГЮЙКЧВ╦ММНЛС ЛЕФДС РЕЦЮЛХ
# <pre></pre>. image/gif -- йЮПРХМЙЮ, ТНПЛЮР gif video/mpeg --
# mpeg-БХДЕН х ЖЕКЮЪ ЙСВЮ ДПСЦХУ ТНПЛЮРНБ, ЯЛ. ТЮИК mime.types ХГ apache
print "\n";
# <-- ЕЫЕ НДМЮ ОСЯРЮЪ ЯРПНЙЮ, НАНГМЮВЮЕР ЙНМЕЖ БШБНДЮ МЮЬХУ
# ГЮЦНКНБЙНБ. бюфмн!
# рЕОЕПЭ ЛШ ЛНФЕЛ МЮОХЯЮРЭ ЯБНИ РЕЙЯР ЙКХЕМРС
print qq{
<html>
<head>
<title>лНЪ ОЕПБЮЪ CGI ОПНЦПЮЛЛЮ</title>
</head>
<body>
<h1>лНЪ ОЕПБЮЪ CGI ОПНЦПЮЛЛЮ</h1>
</body>
</head>
};
бГЮХЛНДЕИЯРБХЕ Я ЙКХЕМРНЛ НАЕЯОЕВХБЮЕРЯЪ РЮЙ: нМ ГЮОНКМЪЕР ТНПЛС ЯБНХЛХ ГМЮВЕМХЪЛХ, МЮФХЛЮЕР МЮ ЙМНОЙС "submit", АПНСГЕП ЙНДХПСЕР ДЮММШЕ ЯННРБЕРЯРБСЧЫХЛ НАПЮГНЛ Х НРОПЮБКЪЕР ХУ ЯЕПБЕПС.
оПНХГБНДХРЯЪ РЕЦЮЛХ <form> Х </form>. рЕЦ НОПЕДЕКЕМХЪ ТНПЛ ХЛЕЕР ЯКЕДСЧЫХЕ ЮРПХАСРШ
ЯЙПХОР МЮ ЯЕПБЕПЕ, ЙНРНПШИ АСДЕР ГЮОСЫЕМ МЮ ЯЕПБЕПЕ ДКЪ НАПЮАНРЙХ ДЮММШУ ТНПЛШ.
РХО БГЮХЛНДЕИЯРБХЪ Я ЯЕПБЕПНЛ. лНФЕР ХЛЕРЭ ГМЮВЕМХЪ GET Х POST. оКЧЯ, ЕЫЕ МЕЙНРНПШЕ ЯОЕЖХЮКЭМШЕ, ЙНРНПШЕ БШ ЛНФЕРЕ ОНЯЛНРПЕРЭ Б rfc
тНПЛШ МЕ ЛНЦСР АШРЭ БКНФЕММШЛХ.
щКЕЛЕМРШ ББНДЮ
нОПЕДЕКЪЧРЯЪ РЕЦЮЛХ <input>, <textarea> Х <select> РЕЦ <input>:
щКЕЛЕМР ББНДЮ "нОЖХЪ"
щКЕЛЕМР ББНДЮ, ЙНРНПШИ МЕ БХДЕМ ОНКЭГНБЮРЕКЧ
Б Netscape Navigator ОНГБНКЪЕР ГЮЦПСГХРЭ ТЮИК МЮ ЯЕПБЕП
хГНАПЮФЕМХЕ. еЯКХ ОН МЕЛС ЫЕКЙМСРЭ, ЩРН БШГНБЕР submit ТНПЛШ Х ЯЕПБЕПС АСДСР БШДЮМШ ДБЕ ОЕПЕЛЕММШЕ БХДЮ name.x Х name.y, ЦДЕ name -- РН, ВРН БШ ОПНОХЬЕРЕ Б name=... РЕЦЮ <input>
щКЕЛЕМР ББНДЮ оЮПНКЭ. оНГБНКЪЕР ББЕЯРХ ЯРПНЙС, ЙНРНПЮЪ МЮ ЩЙПЮМЕ НРНАПЮФЮЕРЯЪ ГБЕГДНВЙЮЛХ. мХЙЮЙХУ ЛЕРНДНБ ГЮЫХРШ ОПХ ОЕПЕДЮВЕ МЮ ЯЕПБЕП МЕ ОПХЛЕМЪЕРЯЪ
пЮДХНЙМНОЙХ
йМНОЙЮ ЯАПНЯЮ ГМЮВЕМХИ ТНПЛШ МЮ МЮВЮКЭМШЕ
йМНОЙЮ НРОПЮБЙХ ТНПЛШ МЮ ЯЕПБЕП
ЯРПНЙЮ ББНДЮ
бЯЕ РЕЦХ <input> ХЛЕЧР ЮРПХАСР name -- мЮХЛЕМНБЮМХЕ ЩКЕЛЕМРЮ. яКСФХР ДКЪ ХДЕМРХТХЙЮЖХХ ОПХ ОЕПЕДЮВЕ МЮ ЯЕПБЕП, Ю РЮЙФЕ ДПСЦХЕ РХОЮ value, width, etc, МЮГБЮМХЕ Х МЮГМЮВЕМХЕ ЙНРНПШУ ЛНФМН НОЪРЭ-РЮЙХ ОНЯЛНРПЕРЭ Б СВЕАМХЙЕ.
рЕЦ <textarea> -- оНКЕ ЛМНЦНЯРПНВМНЦН ББНДЮ.
рЕЦ <select> -- ЯОХЯНВМШИ БШАНП
оПХЛЕП:
<form action=/cgi-bin/myscript.pl method=GET>
хЛЪ: <input type=string name=name><p>
оНК: <input type=radio name=gender value=male>лСФЯЙНИ
<input type=radio name=gender value=female>фЕМЯЙХИ
<input type=submit><input type=reset>
</form>
щРН НОПЕДЕКЪЕРЯЪ ЛЕРНДНЛ ТНПЛШ, GET ХКХ POST
б ЯКСВЮЕ GET ЯЕПБЕП СЯРЮМНБХР ОЕПЕЛЕММСЧ НЙПСФЕМХЪ QUERY_STRING Б БХДЕ name1=vaue1&name2=value2&..&nameN=valueN.
б ЯКСВЮЕ POST ЮМЮКНЦХВМЮЪ ЯРПНЙЮ АСДЕР ГЮОХЯЮМЮ МЮ ЯРЮМДЮПРМШИ ББНД. еЕ ДКХМС ЛНФМН ОНКСВХРЭ ВЕПЕГ ОЕПЕЛЕММСЧ НЙПСФЕМХЪ CONTENT_LENGTH.
б НАНХУ ЯКСВЮЪУ ДЮММШЕ АСДСР ГЮЙНДХПНБЮМШ ОН ЯКЕДСЧЫЕЛС ЮКЦНПХРЛС:
tr/+/ /;
s/%([0-9a-fA-F]{2})/pack("c",hex($1))/ge;
(ЯОХЯЮМН ХГ CGI.pm)
мЮ ЯЮЛНЛ ДЕКЕ, ЛНФМН МЕ БНГХРЯЪ ЯН БЯЕЛ ЩРХЛ, Ю ХЯОНКЭГНБЮРЭ ЛНДСКЭ CGI.pm (хЛЕЕРЯЪ Б ОНЯРЮБЙЕ Perl 5.004 Х АНКЕЕ ОНГДМХУ. еЯКХ С БЮЯ perl БЕПЯХХ 4 ХКХ 1, МСФМН ЯПНВМН БГЪРЭ МЮ CPAN МНБСЧ БЕПЯХЧ perl)
оПЕДОНКНФХЛ ЛШ ДЕКЮЕЛ ОНХЯЙНБСЧ ЯХЯРЕЛС, РНЦДЮ С МЮЯ ДНКФЕМ АШРЭ HTML Я ТНПЛНИ Х ОПНЦПЮЛЛЮ, ЙНРНПЮЪ АСДЕР БШОНКМЪРЭ ОНХЯЙ.
search.html
<html>
<head>
<title>оНХЯЙ</title>
</head>
<<body>
<h1>вЕЦН ХЯЙЮРЭ?</h1>
<form action=/cgi-bin/search.pl method=get>
яРПНЙЮ ДКЪ ОНХЯЙЮ: <input type=text name=string width=70><p>
хЯЙЮРЭ Б <input type=checkbox name=searchin value=internet>хМРЕПМЕР
<input type=checkbox name=searchin value=intranet>хМРПЮМЕР
<input type=checkbox name=searchin value=extranet>щЙЯРПЮМЕР<p>
<input type=submit value=дЮБЮИ!><input type=reset value="мЕР, МЕ МЮДН">
</form>
</body>
</html>
оПНЦПЮЛЛЮ:
#!/usr/bin/perl -- ОНЛЕМЪИРЕ, ЙЮЙ МЮДН
use CGI qw(:standard);
print "Content-Type: text/html\n\n"; # мЕ ГЮАСДЭРЕ ОПН ДБЮ "\n"
$string = param("string");
@searchin = param("searchin"); # searchin ЩРН checkbox Х ЕЦН ГМЮВЕМХЪ
# БНГБПЮЫЮЧРЯЪ ЯОХЯЙНЛ
# хЯЙЮРЭ ЛШ ЯЕЦНДМЪ МХВЕЦН МЕ АСДЕЛ
print "<html>
<body>
<h1>лШ ЯЕЦНДМЪ МХВЕЦН МЕ ХЫЕЛ</h1>
мН, ЕЯКХ АШ ХЯЙЮКХ, РН: <br>
хЯЙЮКХ АШ ЯРПНЙС <b>$string</b><br>\n";
print "б <b>" . join(" ", @searchin) . "</b>\n";
print "
</body>
</html>
";
дЮ, ЙЯРЮРХ, ЕЯКХ БШ ЯНАХПЮЕРЕЯЭ ОХЯЮРЭ Б ТЮИКШ Я ОНЛНЫЭЧ CGI-ОПНЦПЮЛЛ, МЕ ГЮАШБЮИРЕ ОПН file locking (яЛ. ВЮЯРЭ C ГЮ ОНДПНАМНЯРЪЛХ).
бШДЮБЮИРЕ ГЮЦНКНБЙХ Б РЮЙНЛ БХДЕ:
print "Content-Type: type/sub-type\n"; # оНДЯРЮБЭРЕ бЮЬ РХО/ОНДРХО print "Pragma: no-cache\n"; # дКЪ HTTP/1.0 ЙКХЕМРНБ print "Cache-Control: no-cache\n"; # дКЪ HTTP/1.1 print "Expires: Thu Jan 1 00:00:00 1970\n\n"; # щРН СФЕ КЧАНИ АПНСГЕП ДНКФЕМ # ОНМЪРЭ
б ГЮЦНКНБЙЕ МЮОХЬХРЕ:
print "Status: 302\n"; # хКХ 301. пЮГМХЖЮ ЯНЯРНХР Б РНЛ, ВРН ОН ЯРЮМДЮПРС 301 ГМЮВХР "ОЕПЕЛЕЫ╦М # МЮБЯЕЦДЮ", Ю 302 -- "ОЕПЕЛЕЫ╦М БПЕЛЕММН" print "Location: бюь мНБШИ URL\n"; # URL ДНКФЕМ АШРЭ СЙЮГЮМ ЮАЯНКЧРМШИ print "URI: бюь МНБШИ URL\n\n"; # дКЪ http/1.0оНДПНАМНЯРХ: ЯЛ. rfc1945(http/1.0), rfc2068(http/1.1)
б ОНЯРЮБЙС CGI.pm БУНДХР ОПХЛЕП file_upload.cgi. гЮ ОНДПНАМНЯРЪЛХ ЯЛНРПХРЕ CGI(3).
сВРХРЕ, ВРН ЕЯКХ С БЮЯ ЯХЯРЕЛЮ, ЙНРНПЮЪ ПЮГДЕКЪЕР АХМЮПМШЕ Х РЕЙЯРНБШЕ ТЮИКШ -- БЮЛ ОНМЮДНАХРЯЪ ХЯОНКЭГНБЮРЭ binmode.
рЮЙФЕ, ОНЛМХРЕ, ВРН "пСЯЯЙХИ Apache" МЕ АСДЕР ОПНХГБНДХРЭ ОЕПЕЙНДХПНБЙС multipart ТНПЛ.
бНГЭЛХРЕ МЮ CPAN АХАКХНРЕЙС libwww-perl Х ЯЛНРПХРЕ lwpcook(3), РЮЛ МЮОХЯЮМШ НЯМНБШ ХЯОНКЭГНБЮМХЪ АХАКХНРЕЙХ Х ЕЯРЭ ОПХЛЕПШ.
оКЧЬЙХ ПЮАНРЮЧР ЯКЕДСЧЫХЛ НАПЮГНЛ: ОПНЦПЮЛЛЮ CGI ДНАЮБКЪЕР Б ЯБНИ НРБЕР ДХПЕЙРХБС Set-Cookie, Ю ЙКХЕМР (ЕЯКХ НМ ОНДДЕПФХБЮЕР ОКЧЬЙХ), ОПХ ЯКЕДСЧЫХУ ГЮОПНЯЮУ БНГБПЮЫЮЕР ХУ Б ГЮЦНКНБЙЕ Cookie. яЮЛХ ОКЧЬЙХ ОПЕДЯРЮБКЪЧР ХГ ЯЕАЪ ОЮПШ ХЛЪ=ГМЮВЕМХЕ.
Set-Cookie: ХЛЪ=ГМЮВЕМХЕ; expires=ДЮРЮ; path=ОСРЭ; domain=ДНЛЕМ; secure
яЕПБЕП ЛНФЕР СЯРЮМНБХРЭ МЕ АНКЕЕ 20 ОКЧЬЕЙ, ПЮГЛЕП БЯЕИ ОКЧЬЙХ МЕ ЛНФЕР ОПЕБШЬЮРЭ 4Kb.
ЕДХМЯРБЕММШИ НАЪГЮРЕКЭМШИ ОЮПЮЛЕРП. х ХЛЪ, Х ГМЮВЕМХЕ ЛНЦСР АШРЭ ЯРПНЙЮЛХ РЕЙЯРЮ, МЕ ЯНДЕПФЮЫХЛХ ЯХЛБНКНБ ОЕПЕБНДЮ ЯРПНЙХ, ОПНАЕКНБ, ; Х РЮАСКЪЖХХ. еЯКХ МЕНАУНДХЛН ХУ ХЯОНКЭГНБЮРЭ, ЛНФМН ЩРХ ЯХЛБНКШ ГЮЙНДХПНБЮРЭ ОПХ ОНЛНЫХ ЯРЮМДЮПРМНЦН uri-ЙНДХПНБЮМХЪ.
СЯРЮМЮБКХБЮЕРЯЪ ДЮРЮ ХЯРЕВЕМХЪ ЯПНЙЮ ДЕИЯРБХЪ ОКЧЬЙХ. оНЯКЕ ЩРНИ ДЮРЮ ОКЧЬЙЮ ЙКХЕМРНЛ МЕ БНГБПЮЫЮЕРЯЪ. еЯКХ ДЮРЮ МЕ СЯРЮМНБКЕМЮ, РН ОКЧЬЙЮ ДЕИЯРБСЕР ДН ГЮБЕПЬЕМХЪ ПЮАНРШ АПЮСГЕПЮ.
НАНГМЮВЮЕР ОСРЭ МЮ ЯЕПБЕПЕ, ДКЪ ЙНРНПНЦН БНГБПЮЫЮЕРЯЪ ЩРЮ ОКЧЬЙЮ, ЕЯКХ МЕ СЙЮГЮМН, РН РНКЭЙН ДКЪ РНЦН, ЙНРНПШИ ЕЕ ЯНГДЮК.
ДНЛЕМ, ДКЪ ЙНРНПНЦН БНГБПЮЫЮЕРЯЪ ЩРЮ ОКЧЬЙЮ. лНФЕР АШРЭ ДНЛЕМНЛ СПНБМЪ 2 Х БШЬЕ, Р.Е. .example.ru, Ю МЕ .ru. еЯКХ МЕ СЯРЮМНБКЕМ, РН ОКЧЬЙЮ БНГБПЮЫЮЕРЯЪ РНКЭЙН ЯЕПБЕПС, ЙНРНПШИ БШДЮК ОКЧЬЙС.
СЙЮГШБЮЕР, ВРН ОКЧЬЙЮ ДНКФМЮ БНГБПЮЫЮРЭЯЪ РНКЭЙН ОН ГЮЫХЫЕММНЛС ЯНЕДХМЕМХЧ (SSL).
Cookie: ХЛЪ1=ГМЮВЕМХЕ1; ХЛЪ2=ГМЮВЕМХЕ2;....;ХЛЪn=ГМЮВЕМХЕnоПНЦПЮЛЛШ CGI ЛНЦСР ОНКСВХРЭ ОЮПШ ХЛЪ-ГМЮВЕМХЕ ВЕПЕГ ОЕПЕЛЕММСЧ НЙПСФЕМХЪ HTTP_COOKIE. б ЛНДСКЕ CGI.pm ГМЮВЕМХЕ ЛНФМН ОНКСВХРЭ ОПХ ОНЛНЫХ ЛЕРНДЮ cookie().
б ДЕРЮКЪУ, ЛЕУЮМХГЛ ОКЧЬЕЙ НОХЯЮМ Б rfc2109 (HTTP State Management Mechanism. D. Kristol, L. Montulli. February 1997.)
оПХЛЕП: 1. сЯРЮМНБЙЮ ОКЧЬЙХ
setcookie.pl
#!/usr/bin/perl
print "Content-Type: text/html\n";
print "Set-Cookie: mycookie=some+string\n\n";
print "<html><head><title>сЯРЮМНБЙЮ ОКЧЬЙХ</title></head>\n";
print "<body><h1>сЯРЮМНБЙЮ ОКЧЬЙХ</h1>\n";
print "<a href=getcookie.pl>ыЕКЙМХ ГДЕЯЭ,</a> ВРНАШ ОНЯЛНРПЕРЭ, ВРН
ОНКСВХКНЯЭ.
print "</body></html>";
2. оНКСВЕМХЕ ОКЧЬЙХ
getcookie.pl;
#!/usr/bin/perl
use CGI qw(:standard);
print "Content-Type: text/html\n\n";
print "<html><head><title>оНКСВЕМХЕ ОКЧЬЙХ</title></head>\n";
print "<body><h1>оКЧЬЙЮ</h1>\n";
print "mycookie = ", getcookie('mycookie');
print "</body></html>";
мЮДН НРПЕДЮЙРХПНБЮРЭ ЙНМТХЦСПЮЖХНММШЕ ТЮИКШ (Ъ ПЮЯЯВХРШБЮЧ, ВРН С БЮЯ default ЙНМТХЦХ apache) (NB: Apache/1.3.6 Х БШЬЕ ОН СЛНКВЮМХЧ ЙНМТХЦСПХПСЕРЯЪ РНКЭЙН ТЮИКНЛ httpd.conf. дХПЕЙРХБШ БЯЕ НЯРЮКХЯЭ ОПЕФМХЕ, ОПНЯРН ХУ ЯКХКХ Б НДХМ ТЮИК)
srm.conf
дХПЕЙРХБЮ ScriptAlias
ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin/
Х Б ТЮИКЕ access.conf ОПНОХЯЮРЭ
<Directory /usr/local/apache/cgi-bin/>
Options ExecCGI
</Directory>
(ЕЯКХ ОПХЦКЪДЕКЯЪ, РЮЛ МСФМН РНКЭЙН ПЮЯЙНЛЕМРХПНБЮРЭ НОЖХХ)
щРН ОНГБНКХР БЮЛ ОНЛЕЫЮРЭ ОПНЦПЮЛЛШ Б ЙЮРЮКНЦ
/usr/local/apache/cgi-bin/ Х НМХ АСДСР БХДМШ ОН URL
http://you/cgi-bin/program_name
дНАЮБХРЭ Б srm.conf ДХПЕЙРХБС AddHandler cgi-script .cgi
Х БШ ЯЛНФЕРЕ БШГШБЮРЭ cgi-ОПНЦПЮЛЛС ХГ КЧАНЦН ЙЮРЮКНЦЮ. мН НМЮ ДНКФМЮ ХЛЕРЭ
НЙНМВЮМХЕ .cgi Х ДКЪ МЕЕ ДНКФМН АШРЭ ПЮГПЕЬЕМН ХЯОНКМЕМХЕ CGI
(Options ExecCGI Б access.conf, МЮОХЯЮМН БШЬЕ).
нАЮ ЯОНЯНАЮ ЛНФМН АЕГ ОПНАКЕЛ ХЯОНКЭГНБЮРЭ ЯНБЛЕЯРМН.
оПЕФДЕ ВЕЛ ВХРЮРЭ ДЮКЭЬЕ, САЕДХРЕЯЭ Б РНЛ, ВРН:
error_log ДКЪ РНЦН Х ЯКСФХР, ВРНАШ РСДЮ ЯЛНРПЕРЭ :-)
бНГМХЙЮЕР, ЕЯКХ ЯЕПБЕП МЕ ЛНФЕР НРДЮРЭ БЮЛ ЯНДЕПФХЛНЕ ОН ОПХВХМЕ НРЯСРЯРБХЪ ОНКМНЛНВХИ.
оПНБЕПЭРЕ:
бНГМХЙЮЕР Б ЯКСВЮЕ БМСРПЕММЕИ НЬХАЙХ.
оПНБЕПЭРЕ:
print "Content-Type: text/html\n";
print "<HTML>\n";
мЮДН ОХЯЮРЭ:
print "Content-Type: text/html\n\n"; # дБЮ "\n"
print "<HTML>\n";
рЮЙФЕ, ЩРЮ НЬХАЙЮ БНГМХЙЮЕР, ЕЯКХ CGI-ОПНЦПЮЛЛЮ ГЮБЕПЬХКЮЯЭ Я МЕМСКЕБШЛ ЙНДНЛ БНГБПЮРЮ, ВРН ВЮЯРН БЯРПЕВЮЕРЯЪ Б ЯКСВЮЕ МЕЙНЛОХКХПСЕЛНЯРХ БЮЬЕЦН ЯЙПХОРЮ perl'НЛ.
яНБЕР: ДЕКЮИРЕ
use CGI::Carp qw(fatalsToBrowser)
БН БПЕЛЪ НРКЮДЙХ, РНЦДЮ БЮЛ БШДЮДСР ЯННАЫЕМХЕ НА НЬХАЙЕ perl.
apache СЯРЮМЮБКХБЮЕР ОЕПЕЛЕММСЧ НЙПСФЕМХЪ REMOTE_HOST, ЕЯКХ ЕЛС ПЮГПЕЬЕМН ОПНБНДХРЭ dns ГЮОПНЯШ ДКЪ НОПЕДЕКЕМХЪ ХЛЕМХ. дКЪ 1.3.x ОН-СЛНКВЮМХЧ ЩРН БШЙКЧВЕМН. бЙКЧВЮЕРЯЪ/БШЙКЧВЮЕРЯЪ ДХПЕЙРХБНИ HostNameLookups, ЙНРНПЮЪ ЛНФЕР ОПХМХЛЮРЭ 3 ГМЮВЕМХЪ: on -- ОПНБНДХРЭ ГЮОПНЯШ, off -- МЕ ГЮОПЮЬХБЮРЭ dns Х double -- ДЕКЮРЭ ДБНИМШЕ ГЮОПНЯШ: ГЮОПЮЬХБЮРЭ ХЛЪ УНЯРЮ, Ю ГЮРЕЛ ОН ХЛЕМХ ГЮОПЮЬХБЮРЭ ip ЮДПЕЯ, ДКЪ АЕГНОЮЯМНЯРХ.
оЕПЕЛЕММЮЪ НЙПСФЕМХЪ REMOTE_USER СЯРЮМЮБКХБЮЕРЯЪ apache Б ЯКСВЮЕ, ЕЯКХ ЯЙПХОР ГЮЫХЫЕМ ОЮПНКЕЛ. йЮЙ ЩРН ЯДЕКЮРЭ ПЮЯЯЙЮГЮМН МЮ http://www.apacheweek.com/features/userauth Х http://www.apacheweek.com/features/dbmauth
щРН perl, БЙНЛОХКХПНБЮММШИ Б apache, ВРН ОПХДЮЕР ЛМНЦХЕ ОПЕХЛСЫЕЯРБЮ:
оПЮБДЮ, МХВЕЦН МЕ ДЮЕРЯЪ ДЮПНЛ Х ЯЮЛШИ БЮФМШИ МЕДНЯРЮРНЙ mod_perl -- НЦПНЛМШИ ПЮЯУНД ОЮЛЪРХ: ЕЯКХ НАШВМШИ apache ГЮМХЛЮЕР ОПХ ПЮАНРЕ НАШВМН ЛЕМЭЬЕ ЛЕЦЮАЮИРЮ, РН apache Я mod_perl ПЮГЛЕПНЛ Б 10-15 Mb -- БОНКМЕ МНПЛЮКЭМНЕ ЪБКЕМХЕ. мН, ОПХ ОПЮБХКЭМНИ МЮЯРПНИЙЕ, ГМЮВХРЕКЭМЮЪ ВЮЯРЭ ЩРНИ ОЮЛЪРХ АСДЕР shared ЛЕФДС ЙНОХЪЛХ ОПНЖЕЯЯНБ.
нЯМНБМНИ ЯЮИР ОПН mod_perl - http://perl.apache.org, Б ВЮЯРМНЯРХ БЕКХЙНКЕОМШИ mod_perl Guide МЮ http://perl.apache.org/guide/.
оПНЦПЮЛЛЮ CGI ХЯОНКМЪЕРЯЪ НДХМ ПЮГ, ГЮ РЕЛ СЛХПЮЕР. оНД mod_perl ФЕ НМЮ ГЮЦПСФЮЕРЯЪ Х ХЯОНКМЪЕРЯЪ ДН ЯЛЕПРХ ЯЕПБЕПЮ (Б ЯКСВЮЕ ХЯОНКЭГНБЮМХЪ Apache::Registry, ЯЛ. ДЮКЕЕ), ОНЩРНЛС НМЮ РПЕАСЕР АНКЕЕ ЮЙЙСПЮРМНЦН НОХЯЮМХЪ - ГЮЙПШБЮРЭ ТЮИКШ, МЕ ХЯОНКЭГНБЮРЭ ЛМНЦН ОЮЛЪРХ, Х РД.
аНКЕЕ ОНДПНАМН Н ОЕПЕОХЯШБЮМХХ ОПНЦПЮЛЛ CGI ОНД mod_perl - http://perl.apache.org/guide/porting.html.
дЮ, ЛНФМН. CGI МЕ ГЮБХЯХР НР ХЯОНКЭГСЕЛНЦН ЪГШЙЮ ОПНЦПЮЛЛХПНБЮМХЪ.
щРН ДЮКЕЙН МЕОНКМШИ ЯОХЯНЙ. (оНВРХ ОНКМНЯРЭЧ ЯОХЯЮМН ХГ CGI_metaFAQ НР brian d foy).
бШ ЛНФЕРЕ ХЯОНКЭГНБЮРЭ ОПНЯРНИ РЕЙЯРНБШИ ТЮИК Я ПЮГДЕКХРЕКЪЛХ. мЮОПХЛЕП, ЕЯКХ ЛШ ОХЬЕЛ МЕВРН РХОЮ РЕКЕТНММНИ ЙМХЦХ, РН БОНКМЕ БЕПНЪРМН ОПЕДОНКНФХРЭ, ВРН МХ Б ВЭЕЛ ХЛЕМХ, МХ Б МНЛЕПЕ РЕКЕТНМЮ МЕ БЯРПЕРХРЯЪ ОНЯКЕДНБЮРЕКЭМНЯРЭ ::, РЮЙ ВРН ХЛЕММН ЕЕ Х ЛНФМН ХЯОНКЭГНБЮРЭ Б ЙЮВЕЯРБЕ ПЮГДЕКХРЕКЕИ.
тЮИК Я ДЮММШЛХ ЛНФЕР БШЦКЪДЕРЭ РЮЙ:
phones.data
хБЮМНБ х.х.::888-0000::йЮЙЮЪ-РН СКХЖЮ, 17, ЙБ 40
яХДНПНБ о.х.::888-8429::дПСЦЮЪ СКХЖЮ, 5, ЙБ 21
...... Х РД.
РНЦДЮ ОПНЦПЮЛЛЮ, ЙНРНПЮЪ ВХРЮЕР ДЮММШЕ, ЛНФЕР АШРЭ ОПХЛЕПМН РЮЙНЦН БХДЮ:
dump_phones.pl
#!/usr/bin/perl
$filename = 'phones.data';
# НРЙПШБЮЕЛ ТЮИК
open DATA, $filename or die "мЕБНГЛНФМН НРЙПШРЭ $filename: $!";
# ВХРЮЕЛ ОНЯРПНВМН ХГ ТЮИКЮ
while (<DATA>) {
chomp; # СДЮКЕМХЕ ЯХЛБНКЮ ЙНМЖЮ ЯРПНЙХ
# РЕОЕПЭ Б $_ ЕЯРЭ ЯРПНЙЮ Х ЛШ ЕЕ ПЮГДЕКЪЕЛ МЮ ОЕПЕЛЕММШЕ
($name, $phone, $address) = split(/::/);
# Х БШБЕДЕЛ МЮ ОЕВЮРЭ
print "хЛЪ: $name, РЕКЕТНМ: $phone, ЮДПЕЯ: $address\n";
}
close DATA;
аНКЭЬЕ ОПНАКЕЛ БНГМХЙЮЕР Б ЯКСВЮЕ, ЕЯКХ МЮДН СДЮКХРЭ ХКХ НРПЕДЮЙРХПНБЮРЭ ГЮОХЯЭ, МН Х ХУ ЛНФМН ДНБНКЭМН ОПНЯРН Х ЩКЕЦЮМРМН ПЕЬХРЭ, ЕЯКХ ХЯОНКЭГНБЮРЭ ЛЕУЮМХГЛ ПЕДЮЙРХПНБЮМХЪ МЮ ЛЕЯРЕ (inplace edit) -- ОПХ ХЯОНКЭГНБЮМХХ НОЕПЮЖХХ "ПНЛА"(<>), ЛНФМН ВХРЮРЭ ХГ НДМНЦН ТЮИКЮ, Ю ОХЯЮРЭ Б ДПСЦНИ:
change_phones.pl
#!/usr/bin/perl
$^I = '~'; # ГЮОСЯЙЮЕЛ inplace edit
while (<>) { # нАПЮРХРЕ БМХЛЮМХЕ, ВРН ЛШ МЕ НРЙПШБЮКХ ТЮИК: ОПХ РЮЙНИ
#ЙНМЯРПСЙЖХХ ХЛЪ ТЮИКЮ АЕПЕРЯЪ ХГ ЙНЛЮМДМНИ ЯРПНЙХ
chomp;
($name, $phone, $address) = split(/::/);
if (.... МЕЙНРНПНЕ СЯКНБХЕ, ОПХ ЙНРНПНЛ ЛШ НЯРЮБКЪЕЛ МЮЬХ ДЮММШЕ ... )
{
print "$name::$phone::$address\n"; # РЕОЕПЭ ДЮММШЕ ЕЯРЭ Б МНБНЛ ТЮИКЕ
}
}
ЕЯКХ ГЮОСЯРХРЭ ЩРН ОПНЦПЮЛЛС ЙЮЙ
change_phones.pl phones.data,РН Б РЕЙСЫЕЛ ЙЮРЮКНЦЕ АСДСР ДБЮ ТЮИКЮ: phones.data, Я ГЮОХЯЪЛХ, ЙНРНПШЕ СДНБКЕРБНПХКХ МЮЬХЛ СЯКНБХЪЛ Х phones.data -- ОПЕДШДСЫЮЪ ЙНОХЪ.
рЮЙФЕ, БН ЛМНЦХУ ЯКСВЮЪУ, БЯЧ ОПНЦПЮЛЛС РЮЙНЦН РХОЮ ЛНФМН ГЮОХЯЮРЭ ЙЮЙ one-liner:
perl -i~ -n -e 'print if(... СЯКНБХЕ)'
дКЪ ВРЕМХЪ ДБНХВМШУ ТЮИКНБ Б Perl ЛНФМН ХЯОНКЭГНБЮРЭ ТСМЙЖХХ read Х unpack. й ОПХЛЕПС, ЕЯКХ ХЯОНКЭГНБЮРЭ ДБНХВМШИ ТЮИК ДКЪ УПЮМЕМХЪ РЕКЕТНММНИ ЙМХЦХ РЮЙНЦН ТНПЛЮРЮ:
40 ЯХЛБНКНБ -- ТЮЛХКХЪ, х.н.
10 ЯХЛБНКНБ -- МНЛЕП РЕКЕТНМЮ,
60 ЯХЛБНКНБ -- ЮДПЕЯ,
РН ЯРПНЙЮ НОХЯЮМХЪ ТНПЛЮРЮ ДКЪ unpack АСДЕР БШЦКЪДЕРЭ РЮЙ:
$format_str = 'A40 A10 A60', Ю ЯЮЛЮ ОПНЦПЮЛЛЮ, ЮМЮКНЦХВМЮЪ ОЕПБНЛС ОПХЛЕПС:
binary_phones.pl
#!/usr/bin/perl
$format_str = 'A40 A10 A60';
open DATA, 'binary.dat' or die "$!";
while (read(DATA, $buf, 40+10+60)) { # <DATA> МЕ ОНЙЮРХР: РЮЙЮЪ
# ЙНМЯРПСЙЖХЪ АСДЕР ВХРЮРЭ ДН ЯХЛБНКЮ ОЕПЕБНДЮ ЯРПНЙХ, Ю ЩРН МЕ РН, ВРН МСФМН
($name, $phone, $address) = unpack($format_str, $buf);
# рЕОЕПЭ Б $name, $phone, $address ЕЯРЭ ДЮММШЕ Х Я МХЛХ ЛНФМН ДЕКЮРЭ
# БЯЕ, ВРН ГЮУНВЕРЯЪ
}
close DATA;
вРНАШ БШБЕЯРХ Б ТЮИК РЮЙСЧ ГЮОХЯЭ ЛНФМН ХЯОНКЭГНБЮРЭ ЙНМЯРПСЙЖХЧ РХОЮ
print FILE pack($format_str, $name, $phone, $address);
дЮ, ЛНФМН. мЮ http://www.fi.muni.cz/~adelton/ ЕЯРЭ ЛНДСКЭ XBase, ЙНРНПШИ ОНГБНКЪЕР ВХРЮРЭ/ОХЯЮРЭ dbf. оПХ ВРЕМХХ НМ ДЮФЕ ОНДДЕПФХБЮЕР ХМДЕЙЯШ. йПНЛЕ РНЦН, Б ЙНЛОКЕЙР ОНЯРЮБЙХ РЮЙФЕ БУНДХР ЛНДСКЭ DBD::XBase, ОПХ ОНЛНЫХ ЙНРНПНЦН ЛНФМН НОЕПХПНБЮРЭ dbf МЮ SQL (АНКЕЕ ОНДПНАМН ОПН DBI -- ДЮКЕЕ).
й ТЮИКЮЛ MS Access МЕКЭГЪ НАПЮЫЮРЭЯЪ ХГ perl МЮОПЪЛСЧ, ОН ЙПЮИМЕИ ЛЕПЕ, Б МЮЯРНЪЫЕЕ БПЕЛЪ.
й MS Access ЛНФМН НАПЮЫЮРЭЯЪ ОН ODBC, ОПХ ОНЛНЫХ DBD::ODBC.
оПЕДЯРЮБЭРЕ ЯЕАЕ ЯХРСЮЖХЧ ЙНЦДЮ НДМНБПЕЛЕММН ПЮАНРЮЧР МЕЯЙНКЭЙН ЙНОХИ НДМНИ Х РНИ ФЕ ОПНЦПЮЛЛШ (Й ОПХЛЕПС, cgi-ЯЙПХОРШ, НАЯКСФХБЮЧЫХЕ ГЮОПНЯШ), ВХРЮЧЫХЕ/ОХЬСЫХЕ Б НДХМ ТЮИК, РНЦДЮ ПЮМН ХКХ ОНГДМН БНГМХЙМЕР ЯХРСЮЖХЪ ОПХ ЙНРНПНИ НДХМ ЯЙПХОР ОПНВХРЮК ДЮММШЕ, ОПНХГБЕК МЮД МХЛХ МЕЙНРНПШЕ ДЕИЯРБХЪ Х ЯНАПЮКЯЪ ГЮОХЯЮРЭ ХУ МЮГЮД Б ТЮИК, МН Б ЩРН ФЕ БПЕЛЪ ДПСЦНИ ЯЙПХОР РНФЕ ОПНВХРЮК ДЮММШЕ, РНФЕ ОПНХГБЕК МЮД МХЛХ ДЕИЯРБХЪ, МН (!) НМ ОПНВХРЮК ЯРЮПШЕ ДЮММШЕ, ЙНРНПШЕ НМ Х ГЮОХЬЕР ОНБЕПУ ДЮММШУ, БШДЮММШУ ДПСЦХЛ ЯЙПХОРНЛ. рЮЙХЛ НАПЮГНЛ, Б ТЮИКЕ НЯРЮМСРЯЪ ДЮММШЕ ГЮОХЯЮММШЕ НДМХЛ ХГ ЯЙПХОРНБ -- Б КСВЬЕЛ ЯКСВЮЕ, Б УСДЬЕЛ -- ЯРПСЙРСПЮ ТЮИКЮ АСДЕР ХЯОНПВЕМЮ. вРНАШ ЩРНЦН ХГАЕФЮРЭ Б Unix Х АНКЭЬХМЯРБЕ ДПСЦХУ ня ЕЯРЭ ЯХЯРЕЛМШИ БШГНБ flock(2) ХКХ ЮМЮКНЦХВМШИ.
й ОПХЛЕПС, ЯЙПХОР ЙНРНПШИ ГЮОХЯШБЮЕР ХЛЕМЮ БШГШБЮЧЫХУ УНЯРНБ Б ТЮИК. (мЮ ДЕКЕ РЮЙНИ ЯОХЯНЙ, ЙНМЕВМН, ЛНФМН ОНКСВХРЭ ХГ ФСПМЮКЮ ПЕЦХЯРПЮЖХХ web-ЯЕПБЕПЮ).
lock_exm.pl
#!/usr/bin/perl
use Fcntl; # хЛОНПР ЙНМЯРЮМР
open (HOSTS, '>>hosts.log'); # тЮИК НРЙПШР ДКЪ ДНАЮБКЕМХЪ ГЮОХЯХ
flock(HOSTS, LOCK_EX);
# рЕОЕПЭ ТЮИК ГЮАКНЙХПНБЮМ: еЯКХ КЧАНИ ДПСЦНИ ЯЙПХОР РНФЕ БШГНБЕР flock МЮ
# ЩРНЛ ТЮИКЕ, ЕЦН flock МЕ БЕПМЕР СОПЮБКЕМХЕ Б ОПНЦПЮЛЛС, ОНЙЮ ЛШ МЕ
# ПЮГАКНЙХПСЕЛ ТЮИК. нАПЮРХРЕ БМХЛЮМХЕ: flock -- ДЕЙКЮПЮРХБМЮЪ ТСМЙЖХЪ, ЕЯКХ
# НДХМ ХГ ЯЙПХОРНБ ЕЕ МЕ ХЯОНКЭГСЕР ОПХ ГЮОХЯХ, РН БЯЪ БЮЬЮ АКНЙХПНБЙЮ МЕ
# ПЮАНРЮЕР.
print HOSTS $ENV{REMOTE_HOST}, "\n"; # ГЮОХЯЮКХ ЯРПНЙС
close HOSTS; # тЮИК ОПХ ГЮЙПШРХХ ПЮГАКНЙХПСЕРЯЪ ЮБРНЛЮРХВЕЯЙХ
# бШБЕЯРХ ЯННАЫЕМХЕ ДКЪ ОНКЭГНБЮРЕКЕИ
print "Content-Type: text/plain\n\n";
print "мЮГБЮМХЕ БЮЬЕЦН УНЯРЮ ГЮОХЯЮМН\n";
аНКЕЕ ОНДПНАМШИ ПЮЯЯЙЮГ Н flock Х ОПХЛЕП ДНЯРСОМШ МЮ http://w3.stonehenge.com/merlyn/WebTechniques/col04.html
яСДЪ ОН perlfaq5(1), ЛНФМН ХЯОНКЭГНБЮРЭ ЛНДСКЭ File::Lock Я CPAN.
DBI -- ЩРН ХМРЕПТЕИЯ ОПХЙКЮДМШУ ОПНЦПЮЛЛ Й ясад, ХЯОНКЭГСЧЫХЛ SQL Б ЙЮВЕЯРБЕ ЪГШЙЮ ГЮОПНЯНБ. яЮЛ DBI НОПЕДЕКЪЕР РНКЭЙН МЮАНП ТСМЙЖХИ, ОЕПЕЛЕММШУ Х ЯНЦКЮЬЕМХИ. бЯЪ МЕОНЯПЕДЯРБЕММЮЪ ПЮАНРЮ БШОНКМЪЕРЯЪ Database Drivers (DBD) -- ЛНДСКЪЛХ, НАЕЯОЕВХБЮЧЫХЛХ ЯБЪГЭ Я ясад. DBI РНКЭЙН НАЕЯОЕВХБЮЕР ЯРЮМДЮПРМШИ ХМРЕПТЕИЯ ДКЪ ЩРХУ ДПЮИБЕПНБ.
оНКМЮЪ ЯУЕЛЮ ЮПУХРЕЙРСПШ ОПХ ПЮАНРЕ DBI БШЦКЪДХР ОПХЛЕПМН РЮЙ:
+----------------------+
| оПХЙКЮДМЮЪ ОПНЦПЮЛЛЮ |
+----------------------+
| DBI |
+----------------------+
| DBD |
+----------------------+
| ясад |
+----------------------+
НАЕЯОЕВХБЮЕРЯЪ ОПХ ОНЛНЫХ ЛЕРНДЮ connect ЙКЮЯЯЮ DBI:
$dbh = DBI->connect($dsn, $user, $auth, {options});
щРН НАЗЕЙР, ОПХ ОНЛНЫХ ЕЦН ЛЕРНДНБ НЯСЫЕЯРБКЪЧРЯЪ БГЮХЛНДЕИЯРБХЪ Я ясад.
яРПНЙЮ, НОПЕДЕКЪЧЫЮЪ Й ЙЮЙНИ АЮГЕ ДЮММШУ ОНДЯНЕДХМЪРЯЪ Х ДПСЦХЕ ОЮПЮЛЕРПШ. гЮБХЯХР НР DBD. мЮ ЯЕЦНДМЪЬМХИ ЛНЛЕМР ЯРЮМДЮПРЮ МЕР, МН ПЕЙНЛЕМДНБЮМН ХЯОНКЭГНБЮРЭ ЯРХКЭ ODBC:
&dbi:<ХЛЪ DBD>:databasename=<МЮГБЮМХЕ ад>;host=<хЛЪ УНЯРЮ>;port=<ОНПР>&;
хЛЪ ОНКЭГНБЮРЕКЪ.
мЕВРН, ЮБРНПХГСЧЫЕЕ ОНКЭГНБЮРЕКЪ. нАШВМН ОЮПНКЭ.
оЮПЮЛЕРПШ DBI, ОЕПЕДЮЧРЯЪ ВЕПЕГ ЮМНМХЛМШИ УЕЬ. б МЮЯРНЪЫЕЕ БПЕЛЪ ОНМХЛЮЧРЯЪ РПХ ОЮПЮЛЕРПЮ:
ЕЯКХ СЯРЮМНБКЕМ, РН ОПХ КЧАНИ НЬХАЙЕ DBI САХБЮЕР ОПНЦПЮЛЛС
ЕЯКХ СЯРЮМНБКЕМ, РН ОПХ НЬХАЙЕ DBI БШГШБЮЕР warn
НОПЕДЕКЪЕР ОНПЪДНЙ ПЮАНРШ Я РПЮМГЮЙЖХЪЛХ.
мЮОПХЛЕП:
$dbh = DBI->connect('dbi:Pg:dbname=apavel', 'apavel', 'SomeSecret', {RaiseError=>1, AutoCommit=>0});нГМЮВЮЕР: оНДЯНЕДЕМХЕ Й ясад PostgreSQL, Й АЮГЕ ДЮММШУ apavel, Я ХЛЕМЕЛ ОНКЭГНБЮРЕКЪ apavel Х ОЮПНКЕЛ. бЯЕ НЬХАЙХ АСДСР БШГШБЮРЭ die, ВРН СДНАМН ОПХ НРКЮДЙЕ, Ю БЯЕ ХГЛЕМЕМХЪ АСДСР БМЕЯЕМШ РНКЭЙН ОПХ ОНДРБЕПФДЕМХХ (commit) РПЮМГЮЙЖХИ.
нРЯНЕДХМЕМХЕ НАЕЯОЕВХБЮЕРЯЪ ОПХ ОНЛНЫХ ЛЕРНДЮ disconnect: $dbh->disconnect();
оПХ ПЮАНРЕ Я АЮГЮЛХ ДЮММШУ ОПХ ОНЛНЫХ DBI ХЯОНКЭГСЧРЯЪ ЙСПЯНПШ -- ЯОЕЖХЮКЭМШЕ НАЗЕЙРШ, НАЕЯОЕВХБЮЧЫХЕ ОНЯКЕДНБЮРЕКЭМШИ ДНЯРСО Й ПЕГСКЭРЮРЮЛ ГЮОПНЯНБ. (б ОПНЯРЕИЬХУ ЯКСВЮЪУ ЛНФМН НАНИРХЯЭ Х АЕГ МХУ, Ъ ПЮЯЯЙЮФС НА ЩРНЛ ДЮКЭЬЕ.)
оПХЛЕП РЮАКХЖШ, ХЯОНКЭГСЕЛШИ Б ДЮКЭМЕИЬЕЛ:
foo.sql
create table foo (
bar varchar(50),
baz int
)
$cursor = $dbh->prepare('select bar, baz from foo');
# РЕОЕПЭ $cursor -- ЙСПЯНП, Х ЕЦН МЕНАУНДХЛН ХЯОНКМХРЭ
$cursor->execute;
# оНЯКЕ ХЯОНКМЕМХЪ ГЮОПНЯЮ, ПЕГСКЭРЮР ЛНФМН ОНКСВХРЭ ХГ ЙСПЯНПЮ ОПХ ОНЛНЫХ
# ЛЕРНДЮ fetchrow_array
while (($bar, $baz) = $cursor->fetchrow_array) {
print "bar is: $bar, baz: $baz\n";
}
нВЕМЭ ВЮЯРН АШБЮЕР МЮДН ОНДЦНРНБХРЭ ЙЮЙНИ-КХАН ГЮОПНЯ, Ю ОНРНЛ ХЯОНКЭГНБЮРЭ ЕЦН Я ПЮГМШЛХ ГМЮВЕМХЪЛХ ДЮММШУ. DBI ОПЕДКЮЦЮЕР ДКЪ ЛЕУЮМХГЛ placeholders: б ГЮОПНЯЕ МЮ ЛЕЯРЕ РЮЙХУ ДЮММШУ СЙЮГШБЮЧРЯЪ БНОПНЯХРЕКЭМШЕ ГМЮЙХ, Ю ЯЮЛХ ГМЮВЕМХЪ ОЕПЕДЮЧРЯЪ Б ЛЕРНД execute() ЙСПЯНПЮ. мЮОПХЛЕП:
$cursor = $dbh->prepare('select bar from foo where baz=?'); $cursor->execute($baz);нЯНАЕММН СДНАМН ЩРН Б ЯКСВЮЕ БЯРЮБЙХ ДЮММШУ:
$cursor = $dbh->prepare('insert into foo(bar, baz) values(?, ?)'); while ( ... ) { $cursor->execute($bar, $baz); }
рЮЙХЛ НАПЮГНЛ, ясад ПЮГАХПЮЕР ГЮОПНЯ РНКЭЙН НДХМ ПЮГ, Ю ГЮРЕЛ ОПНЯРН ХЯОНКМЪЕР ЕЦН, ВРН ЩЙНМНЛХР БПЕЛЪ. (еЯРЕЯРБЕММН, ЩРН БЕПМН РНКЭЙН ДКЪ DBMS Я ПЮГДЕКЭМШЛХ parse Х execute, ЯЕИВЮЯ МХ MySQL, МХ PostgreSQL РЮЙНЕ МЕ ОНДДЕПФХБЮЧР, ОНЩРНЛС ХУ ПЕЮКХГЮЖХХ DBD ОПНЯРН ЯНУПЮМЪЧР ГЮОПНЯ ОЕПЕДЮММШИ $dbh->prepare() Х ГЮРЕЛ ОНДЯРЮБКЪЧР Б МЕЦН ДЮММШЕ ОПХ ЙЮФДНЛ $sth->execute().)
DBI ОПЕДНЯРЮБКЪЕР МЕЯЙНКЭЙН ЛЕРНДНБ ДКЪ РЮЙНЦН ПНДЮ ПЮАНРШ: лЕРНДШ ДКЪ ГЮОПНЯНБ:
бНГБПЮЫЮЕР НДМС ЯРПНЙС ГЮОПНЯЮ Б БХДЕ ЛЮЯЯХБЮ
бНГБПЮЫЮЕР БЕЯЭ НРБЕР ЯЕПБЕПЮ Б БХДЕ ЛЮЯЯХБЮ ЯЯШКНЙ МЮ ЛЮЯЯХБШ.
ХЯОНКМЪЕР ГЮОПНЯ
оПХЛЕП:
#ОНКСВХРЭ ГМЮВЕМХЕ bar ОПХ baz=3
($bar) = $dbh->selectrow_array('select bar from foo where baz=3');
# СЯРЮМНБХРЭ baz Б МЕЙНРНПНЕ ГМЮВЕМХЕ ОПХ bar='somestring'
$dbh->do("update set baz=1 where bar='somestring'");
лНФМН МЕЯЙНКЭЙХЛХ ЯОНЯНАЮЛХ: 1. оПНЯРН ОПНЙПСВХБЮЪ ЙСПЯНП:
$c = $dbh->prepare('select baz, bar from foo');
$c->execute;
# ЕЯКХ МСФМЮ ОНЯКЕДНБЮРЕКЭМНЯРЭ Я 26 ОН 50
for ($k = 0; $k < 26; $k++) {
$c->fetchrow_array;
}
# РЕОЕПЭ ЛНФМН БШБЕЯРХ ДЮММШЕ
print "<table border=1><tr><th>bar</th><th>baz</th></tr>\n";
while (($bar, $baz) = $c->fetchtrow_array) {
print "<tr><td>$bar</td><td>$baz</td></tr>\n";
}
$c->finish; # гЮЙПШРЭ ЙСПЯНП
print "</table>";
2. хЯОНКЭГСЪ ЙСПЯНПШ ясад
# оНЙЮГЮМ ЯХМРЮЙЯХЯ PostgeSQL
$dbh->do('declare mycursor cursor for select bar, baz from foo');
$dbh->do('move 25');
# х РЕОЕПЭ АСДЕЛ ОНКСВЮРЭ ДЮММШЕ
$c = $dbh->prepare('fetch forward 25 in mycursor');
while (($bar, $baz) = $c->fetchrow_array) {
print ....;
}
$c->finish;
$dbh->do('close mycursor');
3. дКЪ MySQL ЛНФМН ХЯОНКЭГНБЮРЭ ДХПЕЙРХБС LIMIT
$c = $dbh->prepare('select bar, baz from foo limit 26,25');
while (($bar, $baz) = $c->fetchrow_array) {
print ....;
}
$c->finish;
бПНДЕ ЙЮЙ ЛНФМН ОПХ ОНЛНЫХ DBD::FreeTDS
оНРНЛС ВРН МЮ windows МЕР flock(2).
хЯОНКЭГСИРЕ File::Lock Я CPAN.
Windows ЩРН МЕ unix. нМХ fork МЕ СЛЕЧР.
Perl ДКЪ ЩРНЦН НОХПЮЕРЯЪ МЮ ЛЕУЮМХГЛ locale. й ЯВЮЯРЭЧ, ЩРН ПЮАНРЮЕР Х МЮ windows:
еЯКХ МЮДН ПЮАНРЮРЭ Я CP866, ОХЬЕЛ
use locale; use POSIX; &POSIX::setlocale(&POSIX::LC_ALL, "Russian_Russia.866"); print uc "дЮ, ГДЕЯЭ АСДСР ГЮЦКЮБМШЕ АСЙБШ";
ЕЯКХ KOI8 (sic!):
&POSIX::setlocale(&POSIX::LC_ALL, "Russian_Russia.20866");
ЕЯКХ Я CP1251 -- ОПНЯРН
use locale;
яН БЯЕЛХ РПЕЛЪ ЙНДХПНБЙЮЛХ ПЮАНРЮЧР Х uc/lc, Х /\w/
оПНБЕПЕМН ОНД NT МЮ perl 5.005_02, ЯНАПЮМНЛ ВЕПЕГ VC++ 5.0 ХГ ХЯУНДМХЙНБ, ЯЙЮВЮММШУ Я CPAN/ports/win32/Standard/
щРНЛС ЛНФЕР АШРЭ ЛХККХНМ ПЮГМШУ ОПХВХМ, МН ЯЮЛЮЪ ВЮЯРН БЯРПЕВЮЧЫЮЪЯЪ -- unix Х МЮЯКЕДМХЙХ CP/M ХЯОНКЭГСЧР ПЮГМШЕ ОНЯКЕДНБЮРЕКЭМНЯРХ ЙНМЖЮ ЯРПНЙХ.
еЯКХ БШ ХУ ГЮЦПСФЮЕРЕ ОН ftp, БЙКЧВХРЕ ПЕФХЛ ASCII.