Dmitrij Leonov. Ispol'zovanie Perl v internet-tehnologiyah
---------------------------------------------------------------
© Copyright Dmitrij Leonov
Email: web@hackzone.ru
WWW: http://www.hackzone.ru
Date: 09 Sep 2001
---------------------------------------------------------------
Vvedenie v internet/intranet-tehnologii
Internet (internet) -- eto vsemirnoe ob容dinenie setej, shlyuzov,
serverov i klientskih komp'yuterov, ispol'zuyushchee dlya svyazi edinyj nabor
protokolov TCP/IP. Osnovnaya cherta Internet -- predostavlenie global'nogo
dostupa k informacii i resursam. Informaciya, razmeshchennaya na
internet-servere, stanovitsya dostupnoj iz lyuboj tochki zemnogo shara,
podklyuchennoj k internet. Ispol'zovanie obshchih protokolov semejstva TCP/IP i
edinogo adresnogo prostranstva pozvolyaet govorit' ob Internet kak o edinoj
global'noj "metaseti". Naryadu s internet vydelyayut ponyatie intranet. Intranet
-- eto lokal'naya set' predpriyatiya, osnovannaya na teh zhe protokolah, chto i
internet. |ta tehnologiya pozvolyaet shiroko ispol'zovat' v ramkah seti
predpriyatiya vse vozmozhnosti i narabotki global'noj seti, effektivno reshaya
pri etom zadachu ogranicheniya dostupa k informacii. V to zhe vremya chast'
intranet mozhet byt' otkryta dlya vneshnego dostupa, stanovyas' takim obrazom
chast'yu Internet.
Pod protokolami v dannom kontekste ponimayutsya pravila, opredelyayushchie
posledovatel'nost' dejstvij, neobhodimyh dlya obmena dannymi. Dlya dostavki
informacii na kakoj-libo komp'yuter on dolzhen imet' unikal'nyj identifikator,
ili adres. Rol' takogo identifikatora v tcp/ip igraet ip-adres uzla,
predstavlyayushchij soboj 32-razryadnoe chislo, zapisyvaemoe tetradoj vida
216.122.167.55 (chetyre desyatichnyh chisla ot 0 do 255, razdelennye tochkami). S
kazhdym ip-adresom svyazana 32-razryadnaya maska podseti, razbivayushchaya adres na
dve chasti - na unikal'nyj identifikator seti, k kotoroj prinadlezhit
komp'yuter, i na unikal'nyj identifikator uzla v predelah etoj seti. Maska
eta imeet vid 255.255.255.0, i pri pobitnom umnozhenii nashego ip-adresa iz
primera my poluchim set' 216.122.167 i uzel 55. Razbienie adresa na dve chasti
obespechivaet bol'shuyu upravlyaemost' seti. Kompanii, imeyushchej park iz
neskol'kih soten mashin, net neobhodimosti registrirovat' adres dlya kazhdoj iz
nih - dostatochno zaregistrirovat' na sebya otdel'nuyu podset' i razdavat'
adresa vnutri nee uzhe samostoyatel'no.
Pri prostom podklyuchenii uzla k seti, on poluchaet unikal'nyj adres v
predelah vsej Internet, chto daet vozmozhnost' obmenivat'sya informaciej s
drugimi uzlami. Znanie adresa komp'yutera, podklyuchennogo k seti, daet
vozmozhnost' vospol'zovat'sya servisami, na nem zapushchennymi - s lyubogo drugogo
komp'yutera, podklyuchennogo k seti.
Ris. 1. Shemy podklyucheniya k Internet
Dostatochno chasto ispol'zuetsya shema otsecheniya lokal'noj seti ot
"bol'shoj Internet", kogda komp'yutery lokal'noj seti ne poluchayut pryamogo
dostupa k vneshnemu miru. V etom sluchae mezhdu lokal'noj set'yu i Internet
stavitsya otdel'nyj server, dostupnyj kak iz vneshnej, tak i iz vnutrennej
seti. Takoj server nosit nazvanie proksi-servera (proxy, posrednik).
Vozmozhny razlichnye sposoby realizacii etoj shemy - na urovne otdel'nyh
sluzhb, kak eto proishodit v sluchae tradicionnyh proksi, libo na urovne
paketov tcp/ip, v sluchae ispol'zovaniya NAT, Network Address Translator, no
ideya v oboih sluchayah odna i ta zhe: komp'yuter iz lokal'noj seti obrashchaetsya k
proksi-serveru s pros'boj peredat' zapros nekotoromu vneshnemu serveru.
Poluchiv otvet ot vneshnego servera, proksi perepravlyaet ee lokal'nomu
komp'yuteru.
Podobnaya shema imeet neskol'ko preimushchestv pered pryamym podklyucheniem k
seti. Vo-pervyh, ekonomyatsya "nastoyashchie" ip-adresa, kotoryh cherez nekotoroe
vremya prosto perestanet hvatat' (kak vyyasnilos', 32 razryada, vybrannye dlya
predstavleniya ip-adresa -- eto vovse ne tak uzh i mnogo, i v nastoyashchee vremya
gotovitsya k vnedreniyu novaya versiya ip-adresacii, ipv6). Vo-vtoryh, iz
vneshnej seti mozhno poluchit' dostup tol'ko k promezhutochnomu serveru, chto
povyshaet zashchishchennost' vsej seti. Nakonec, esli neskol'ko komp'yuterov po
ocheredi obrashchayutsya k odnomu i tomu zhe resursu, proksi mozhet sohranit'
rezul'tat pervogo obrashcheniya na svoem zhestkom diske i vydavat' ego v otvet na
povtornye zaprosy.
Ip-adresaciya pozvolyaet tochno identificirovat' komp'yutery, podklyuchennye
k seti. Odnako, zapominat' adresa vida 216.122.167.55 ne slishkom udobno.
Poetomu s samogo nachala razvitiya seti kazhdyj uzel pomimo cifrovogo ip imel
eshche i simvol'noe imya. Sperva vse uzly byli perechisleny v odnom tekstovom
fajle, no po mere rosta seti voznikla neobhodimost' v mehanizme,
obespechivayushchem, vo-pervyh, unikal'nost' imen, vo-vtoryh, sredstva izveshcheniya
vseh podklyuchennyh uzlov ob izmeneniyah.
V nastoyashchee vremya sootvetstvie mezhdu cifrovymi i simvol'nymi adresami
obespechivaetsya serverami imen (Domain Name Servers, DNS). Pod domenom
ponimaetsya mnozhestvo mashin, kotorye administriruyutsya i podderzhivayutsya kak
edinoe celoe. Vsya set' predstavlyaet soboj odnu bol'shuyu ierarhiyu domenov,
pozvolyayushchuyu razgranichit' polnomochiya mezhdu administratorami raznyh setej.
Ierarhiya domenov Internet rastet ot kornevogo (root) domena, ne
imeyushchego imeni. Dalee idet ogranichennoe kolichestvo domenov verhnego urovnya,
v kotoryh mozhet byt' zaregistrirovano prakticheski neogranichennoe kolichestvo
domenov vtorogo urovnya i t.d.
K domenam verhnego urovnya otnosyatsya domeny .com (prednaznachennyj dlya
kommercheskih organizaciya), .edu (obrazovatel'nye uchrezhdeniya), .net (setevye
provajdery, uzlovye komp'yutery), .org (organizacii, ne popadayushchie ni v odnu
iz prochih kategorij), administrirovaniem kotoryh do nedavnego vremeni
zanimalsya tol'ko InterNIC, .gov (iznachal'no prednaznachalsya dlya lyubyh
gosudarstvennyh uchrezhdenij, pozdnee bylo prinyato reshenie o registracii v nem
tol'ko federal'nyh pravitel'stvennyh uchrezhdenij SSHA, registriruyutsya US
Federal Government civilian agency), .mil (voennye uchrezhdeniya SSHA,
registriruyutsya US military agency), .int (mezhdunarodnye organizacii). V
nastoyashchee vremya vedetsya rabota po vvedeniyu dopolnitel'nyh domenov verhnego
urovnya. Krome togo, k domenam verhnego urovnya otnosyatsya nacional'nye domeny
s dvuhbukvennymi imenami (naprimer, .ru, .de), administrirovaniem kotoryh
zanimayutsya nacional'nye instituty.
Ip-adres pozvolyaet tochno identificirovat' komp'yuter, no etogo
nedostatochno. Delo v tom, chto na kazhdom uzle mogut byt' zapushcheny samye
raznye sluzhby Internet - obespechivayushchie peredachu elektronnoj pochty, fajlov,
gipertekstovoj informacii i t.p. Kazhdaya sluzhba ispol'zuet v svoej rabote tot
ili inoj protokol prikladnogo urovnya. Dlya peredachi fajlov - eto protokol FTP
(File Transfer Protocol), peredachi web-stranic - protokol peredachi
gipertekstovoj informacii HTTP(HyperText Transfer Protocol), dlya raboty s
elektronnoj pochtoj - protokoly SMTP, POP3, IMAP i t.d.
Dlya kazhdoj sluzhby otveden otdel'nyj port, predstavlyayushchij soboj chislo ot
0 do 65534. Dlya naibolee populyarnyh sluzhb zarezervirovany standartnye nomera
portov. Tak, dlya FTP eto 21, dlya HTTP - 80, SMTP - 25, POP3 - 110. Vprochem,
eto lish' znacheniya po umolchaniyu, nikto ne meshaet vladel'cu uzla nastroit' eti
sluzhby na rabotu s drugimi portami. Inogda eto prosto neobhodimo - kak,
naprimer, v sluchae s podderzhkoj razlichnyh kodirovok kirillicy v WWW. Kak
izvestno, odni i te zhe simvoly kirillicy v razlichnyh operacionnyh sistemah
oboznachayutsya raznymi kodami, i sushchestvuet po krajnej mere chetyre populyarnye
kodirovki: Windows-1251, KOI8, Mac, DOS. Poskol'ku odna i ta zhe stranica
mozhet byt' zagruzhena pol'zovatelyami razlichnyh sistem, pered ee razrabotchikom
vstaet neprostaya zadacha -- kak sdelat' ee chitaemoj dlya vseh. Sushchestvuet tri
podhoda k resheniyu etoj zadachi. Vo-pervyh, mozhno prosto proignorirovat'
sushchestvovanie neskol'kih kodirovok i gotovit' stranicu v samoj populyarnoj,
kakovoj na segodnya yavlyaetsya Win1251. Vo-vtoryh, gotovit' neskol'ko kopij
stranic - vo vseh kodirovkah. Nedostatki etih podhodov ochevidny. Naibolee
populyarnym na segodnyashnij den' yavlyaetsya reshenie, predusmatrivayushchee
avtomaticheskuyu perekodirovku dokumenta na servere -- v zavisimosti ot togo,
s kakim portom obshchaetsya klientskoe prilozhenie: naprimer, na 8080 -- Win1251,
8083 -- Koi8 i t.p.
Unificirovannye ukazateli resursov (Uniform Resource Locator, URL)
prednaznacheny dlya adresacii setevyh resursov - dokumentov, fajlov i t.p. V
samom obshchem vide URL zapisyvaetsya sleduyushchim obrazom:
[protokol]://[imya][:parol']@[adres][:port][/put'/][dokument][?dopolnitel'naya
informaciya]
Soderzhimoe kvadratnyh skobok yavlyaetsya neobyazatel'nym, lyubaya chast' URL
mozhet byt' opushchena. Zdes'
protokol - simvol'noe oboznachenie protokola, ispol'zuemogo dlya dostupa
k resursu (naprimer, ftp, http);
imya - imya pol'zovatelya;
parol' - v sochetanii s imenem pol'zovatelya ispol'zuetsya pri rabote s
resursami, dostup k kotorym ogranichen;
adres - adres uzla, v domennoj ili cifrovoj forme;
port - nomer porta, esli on otsutstvuet, ispol'zuetsya port po umolchaniyu
dlya dannogo protokola;
put' - put' na servere ot ego kornevogo kataloga, libo otnositel'no
tekushchego kataloga;
dokument - imya dokumenta;
dopolnitel'naya informaciya - ispol'zuetsya pri rabote s servernymi
prilozheniyami.
Sredstva razrabotki web-prilozhenij
Obmen informaciej v Internet osushchestvlyaetsya s pomoshch'yu protokolov
prikladnogo urovnya, realizuyushchih tot ili inoj prikladnoj servis (peresylku
fajlov, gipertekstovoj informacii, pochty i t.d.). Odnim iz naibolee molodyh
i populyarnyh servisov Internet, razvitie kotorogo i privelo k vsplesku
populyarnosti samoj Internet, stala World Wide Web (WWW), osnovannaya na
protokole HTTP (Hyper Text Transfer Protocol -- protokol peredachi
gipertekstovoj informacii). Gipertekstovye dokumenty, predstavlennye v WWW,
imeyut odno principial'noe otlichie ot tradicionnyh gipertekstovyh dokumentov
-- svyazi, v nih ispol'zuyushchiesya, ne ogranicheny odnim dokumentom, i bolee
togo, ne ogranicheny odnim komp'yuterom. Dlya podgotovki gipertekstovyh
dokumentov ispol'zuetsya yazyk HTML (Hyper Text Markup Language -- yazyk
razmetki gipertekstovyh dokumentov), predostavlyayushchij shirokie vozmozhnosti po
formatirovaniyu i strukturnoj razmetke dokumentov, organizacii svyazej mezhdu
razlichnymi dokumentami, sredstva vklyucheniya graficheskoj i mul'timedijnoj
informacii. HTML-dokumenty prosmatrivayutsya s pomoshch'yu special'noj programmy
-- brouzera. Naibol'shee rasprostranenie v nastoyashchee vremya poluchili brouzery
Navigator kompanii Netscape (NN) i Internet Explorer kompanii Microsoft
(MSIE). Realizacii NN dostupny prakticheski dlya vseh sovremennyh programmnyh
i apparatnyh platform, realizacii MSIE dostupny dlya vseh Windows platform,
Macintosh i nekotoryh kommercheskih Unix-sistem.
HTML-dokument sostoit iz teksta, predstavlyayushchego soboj soderzhanie
dokumenta, i tegov, opredelyayushchih ego strukturu i vneshnij vid pri otobrazhenii
brouzerom. Prostejshij html-dokument vyglyadit sleduyushchim obrazom:
<html>
<head>
<title>Nazvanie</title>
</head>
<body>
<p>Telo dokumenta
</body>
</html>
Dannyj kod otobrazhaetsya v brouzere sleduyushchim obrazom:
Ris. 2. Primer html-dokumenta
Kak vidno iz primera, teg predstavlyaet soboj klyuchevoe slovo,
zaklyuchennoe v uglovye skobki. Razlichayut odinarnye tegi, kak, naprimer, <p>,
i parnye, kak <body> </body>, v poslednem sluchae dejstvie tega
rasprostranyaetsya tol'ko na tekst mezhdu ego otkryvayushchej i zakryvayushchej
skobkoj. Tegi takzhe mogut imet' parametry -- naprimer, pri opisanii stranicy
mozhno zadat' cvet fona, cvet shrifta i t.d.: <body bgcolor="white"
text="black">.
Tekst vsego dokumenta zaklyuchaetsya v tegi <html>, sam dokument
razbivaetsya na dve chasti -- zagolovok i telo. Zagolovok opisyvaetsya tegami
<head>, v kotorye mogut byt' vklyucheny nazvanie dokumenta (s pomoshch'yu tegov
<title>) i drugie parametry, ispol'zuyushchiesya brouzerom pri otobrazhenii
dokumenta. Telo dokumenta zaklyucheno v tegi <body> i soderzhit sobstvenno
informaciyu, kotoruyu vidit pol'zovatel'. Pri otsutstvii tegov formatirovaniya
ves' tekst vyvoditsya v okno brouzera sploshnym potokom, perevody strok,
probely i tabulyacii rassmatrivayutsya kak probel'nye simvoly, neskol'ko
probel'nyh simvolov, idushchih podryad, zamenyayutsya na odin. Dlya formatirovaniya
ispol'zuyutsya sleduyushchie osnovnye tegi:
<p> -- nachalo novogo abzaca, mozhet imet' parametr, opredelyayushchij
vyravnivanie: <p align=right>;
<br> -- perevod stroki v predelah tekushchego abzaca;
-- vydelenie teksta poluzhirnym shriftom;
-- vydelenie teksta kursivom;
<u></u> -- vydelenie teksta podcherkivaniem
Ssylka na drugoj dokument ustanavlivaetsya s pomoshch'yu tega <a
href="URL">...</a>, gde URL -- polnyj ili otnositel'nyj adres dokumenta. Pri
etom tekst, zaklyuchennyj v teg <a>, obychno vydelyaetsya podcherkivaniem i
cvetom, i posle shchelchka mysh'yu po etoj ssylke brouzer otkryvaet dokument,
adres kotorogo ukazan v parametre href. Graficheskie izobrazheniya vstavlyayutsya
v dokument s pomoshch'yu tega <img src="URL">.
Sredstva razrabotki klientskih prilozhenij
Ispol'zovanie prilozhenij dlya brouzerov pozvolyaet shiroko ispol'zovat'
vse vozmozhnosti WWW, poskol'ku prilozhenie fakticheski stanovitsya sostavnoj
chast'yu gipertekstovogo dokumenta. |to privodit k sushchestvennomu uproshcheniyu
sistemy podderzhki -- klientskoe PO avtomaticheski obnovlyaetsya pri podklyuchenii
k serveru, dokumentaciya i sistema pomoshchi legko realizuetsya s pomoshch'yu
standartnyh sredstv HTML, a nekotorye uchebnye kursy, k primeru, mogut byt'
realizovany prakticheski polnost'yu sredstvami HTML.
Ris. 3. Shema vzaimodejstviya pol'zovatelya, servera
i servernyh prilozhenij
Pol'zovatel' vzaimodejstvuet s brouzerom (1), kotoryj zaprashivaet (2) i
poluchaet (2) ot veb-servera stranicu s vklyuchennym prilozheniem. Posle etogo
nachinaetsya vzaimodejstvie pol'zovatelya s prilozheniem (4), kotoroe pri
neobhodimosti mozhet svyazat'sya s servernym prilozheniem (5,6) dlya
vzaimodejstviya s SUBD i t.p.
V to zhe vremya sredstv HTML nedostatochno dlya realizacii bolee-menee
slozhnyh klientskih prilozhenij, chto privodit k neobhodimosti ispol'zovaniya
dopolnitel'nyh sredstv, napisaniya vspomogatel'nyh programm.
Mozhno vydelit' sleduyushchie osnovnye problem v razrabotke klientskih
sredstv dlya WWW:
Problema mnogoplatformennosti. Poskol'ku k WWW podklyucheny sistemy,
osnovannye na razlichnyh apparatnyh i programmnyh platformah, voznikaet
neobhodimost' razrabotki dlya kazhdoj platformy, kotoruyu predpolagaetsya
podderzhivat', specializirovannoj versii PO. CHto privodit libo k ogranicheniyu
podderzhivaemyh platform, libo k vozrastaniyu zatrat na razrabotku i podderzhku
PO. Dlya korporativnyh zakrytyh sistem s odnorodnoj arhitekturoj apparatnyh i
programmnyh sredstv apparatnoj eta problema menee aktual'na.
Problema bezopasnosti. Sushchestvuet dve storony problemy -- vozmozhnye
sboi v sisteme iz-za oshibok v programmnom obespechenii i celenapravlennye
dejstviya programmnogo obespecheniya, napravlennye na narushenie
funkcionirovaniya sistemy, kopirovanie konfidencial'noj informacii i t.d.
Otsutstvie v tradicionnyh yazykah vstroennyh sredstv dlya vypolneniya
naibolee chasto vstrechayushchihsya pri rabote s Web operacij -- vzaimodejstviya s
udalennymi serverami, zagruzka fajlov, rabota s izobrazheniyami i t.d.
Znachitel'nyj razmer ispolnyaemyh fajlov, generiruemyh tradicionnymi
sredstvami razrabotki, chto zatrudnyaet ih peredachu po seti.
Naibol'shuyu populyarnost' zavoevali sleduyushchie podhody k realizacii
vspomogatel'nyh prilozhenij dlya klientskoj storony:
Realizaciya podklyuchaemyh modulej (plug-ins) Netscape;
Ispol'zovanie elementov ActiveX;
Ispol'zovanie Java-prilozhenij;
Sredstva podgotovki scenariev JavaScript, VBScript.;
Macromedia Flash.
Rassmotrim ih bolee podrobno.
Ispol'zovanie podklyuchaemyh modulej poluchilo shirokoe rasprostranenie v
svyazi s populyarnost'yu brouzera Netscape Navigator, predostavlyayushchim takuyu
vozmozhnost'. V nastoyashchee vremya eto put' yavlyaetsya tupikovym, poskol'ku ne
predostavlyaet adekvatnogo resheniya ni odnoj iz perechislennyh problem.
K dostoinstvam ispol'zovaniya elementov ActiveX otnositsya realizaciya na
osnove OLE/COM-tehnologii, chto pozvolyaet dostatochno legko perevesti v etu
formu tradicionnoe PO, realizovannoe dlya Win32-platform. Sredi nedostatkov
-- podderzhka v nastoyashchee vremya tol'ko Win32-platformy i podderzhka tol'ko
brouzerom Internet Explorer, hotya dlya Netscape Navigator sushchestvuet plug-in,
pozvolyayushchij ispol'zovat' elementy ActiveX. Razmer elementov ActiveX
minimizirovan za schet ispol'zovaniya razdelyaemyh dinamicheskih bibliotek,
postavlyaemyh vmeste s brouzerom Internet Explorer, kotorye takzhe
predostavlyayut vse neobhodimye dlya setevogo vzaimodejstviya funkcii. Problema
bezopasnosti reshaetsya s pomoshch'yu vvedeniya instituta sertifikatov -- pri
zagruzke pol'zovatelyu pred座avlyaetsya sertifikat proizvoditelya, zaverennyj
nezavisimoj organizaciej (naprimer, VeriSign Inc.), posle chego on mozhet
reshit', doveryat' ili net etomu komponentu. Zashchita ot sboev ne predusmotrena.
Takim obrazom, problema bezopasnosti reshaetsya administrativnymi sredstvami.
Dannaya tehnologiya naibolee prigodna dlya razrabotki korporativnyh
prilozhenij dlya vnutrennego pol'zovaniya -- osobenno v sluchae sushchestvovaniya
gotovyh narabotok v etoj oblasti.
Osnovnym dostoinstvom Java-prilozhenij yavlyaetsya ih nezavisimost' ot
klientskoj platformy. V otlichie ot tradicionnyh prilozhenij, transliruyushchihsya
v ispolnyaemye kody processora, Java-prilozheniya transliruyutsya v tak
nazyvaemyj bajt-kod, interpretiruemyj v dal'nejshem virtual'noj Java-mashinoj.
Pri etom bajt-kod nezavisim ot platformy, na kotoroj on v dal'nejshem budet
vypolnyat'sya -- dostatochno, chtoby dlya etoj platformy byla realizovana
Java-mashina. Poskol'ku bol'shaya chast' osnovnyh funkcij realizovana na urovne
virtual'noj Java-mashiny, eto privodit k sushchestvennomu umen'sheniyu razmerov
bajt-koda. |to yavlyaetsya kak dostoinstvom, tak i nedostatkom Java-prilozhenij
-- poskol'ku bajt-kod interpretiruyutsya virtual'noj mashinoj,
proizvoditel'nost' Java-prilozhenij ustupaet proizvoditel'nosti tradicionnyh
otkompilirovannyh programm. CHastichno s etim udaetsya borot'sya, primenyaya
kompilyatory vremeni ispolneniya (JIT -- just in time compilers),
osushchestvlyayushchie kompilyaciyu prilozheniya pri ego zagruzke v "rodnoj" dlya dannogo
processora kod. Takzhe vozmozhen vyzov funkcij, realizovannyh na drugih yazykah
programmirovaniya (takih kak S, S++) i otkompilirovannyh dlya dannoj platformy
-- tak nazyvaemyj native code. |to primenyaetsya pri realizacii naibolee
kritichnyh k vremeni ispolneniya fragmentov koda.
Drugim dostoinstvom Java-prilozhenij yavlyaetsya ih zashchishchennost' -- kak s
tochki zreniya programmirovaniya (iz yazyka isklyucheny sredstva, naibolee chasto
privodyashchie k oshibkam pri programmirovanii -- takie kak ukazateli, peregruzka
operatorov i t.d., yazyk yavlyaetsya strogo ob容ktno-orientirovannym, v nego
vstroena "sborka musora" i t.d.), tak s tochki zreniya ispolneniya (znachitel'no
ogranichena vozmozhnost' raboty s fajlami na lokal'nyh mashinah, s
ustanovleniem setevyh soedinenij i t.d., programma vypolnyaetsya v otdel'nom
adresnom prostranstve), chto pozvolyaet spokojno rabotat' s prilozheniyami,
poluchennymi iz seti, ne opasayas' nalichiya v nih opasnogo koda. Takim obrazom,
problema bezopasnosti polnost'yu reshena na urovne arhitektury.
Vtoroj nedostatok -- neobhodimost' sushchestvovaniya dlya dannoj platformy
virtual'noj Java-mashiny. Java-mashiny realizovany dlya vseh naibolee
rasprostranennyh platform, no oni ostayutsya dostatochno resursoemkimi i
zachastuyu dovol'no nestabil'nymi sistemami. Krome togo, ostayutsya problemy
nesovmestimosti -- poskol'ku yazyk Java iznachal'no proektirovalsya dlya
napisaniya mnogoplatformennyh prilozhenij, v nego preimushchestvenno vhodili
elementy, dostupnye na vseh platformah, chto privelo k nekotoroj asketichnosti
dostupnyh sredstv. Nekotorye razrabotchiki virtual'nyh mashin rasshiryali ih
vozmozhnosti dlya konkretnoj platformy, chto mozhet privesti k tomu, chto
Java-prilozhenie, ispol'zuyushchee vse eti vozmozhnosti, utratit sposobnost'
zapuskat'sya na drugih platformah. Oshibki v realizacii virtual'noj mashiny
mogut takzhe privesti k snizheniyu bezopasnosti sistemy, za poslednie neskol'ko
let tomu bylo nemalo primerov.
Sushchestvennym dostoinstvom Java yavlyaetsya ee ob容ktnaya orientirovannost'.
Programma na Java predstavlyaet soboj nabor vzaimodejstvuyushchih mezhdu soboj
klassov. S pomoshch'yu klassov osushchestvlyaetsya i dostup k osnovnym servisam
virtual'noj mashiny. Standartnaya biblioteka klassov dostatochno obshirna i
vklyuchaet v sebya klassy dlya raboty s setevymi protokolami -- kak na nizkom,
tak i na prikladnom urovne, s grafikoj, graficheskim pol'zovatel'skim
interfejsom, bazami dannyh, strokami i t.d.
Perechislennye dostoinstva delayut Java-prilozheniya luchshim vyborom v
geterogennyh sistemah, dlya kotoryh bezopasnost' imeet bol'shee znachenie chem
vozmozhnye poteri v proizvoditel'nosti.
JavaScript, VBScript i t.p. predstavlyayut soboj uproshchennye yazyki
podgotovki scenariev, kod kotoryh vstraivaetsya neposredstvenno v html-fajl i
vypolnyaetsya brouzerom. Oni neprigodny dlya realizacii ser'eznyh prilozhenij, v
nih otsutstvuyut sredstva dlya raboty s fajlami, setevogo vzaimodejstviya i
t.d. No oni shiroko ispol'zuyutsya vo vspomogatel'nyh celyah, v kachestve
sredstva pervonachal'noj obrabotki rezul'tatov, dlya oformleniya, "ozhivleniya"
html-dokumentov (t.naz. Dynamic HTML) i t.d.
Macromedia Flash razrabatyvalos' kak sredstvo animacii, osnovannoe na
vektornoj grafike, i v poslednee vremya prakticheski zanyalo tu nishu v
web-dizajne, na kotoruyu eshche neskol'ko let nazad pretendovala Java. Imeet
dostatochno ogranichennye vozmozhnosti po programmirovaniyu, no ves'ma shirokie
-- po postroeniyu mul'timedijnyh prilozhenij v ramkah zadannoj modeli (reakciya
na nazhatie knopok/dvizhenie myshi, animaciya, vektornaya grafika, sloi). Dlya
raboty flash-prilozhenij neobhodimo nalichie sootvetstvuyushchego proigryvatelya,
sushchestvuyushchego dlya bol'shinstva rasprostranennyh platform (v tom chisle, v vide
ActiveX-modulya i Java-appleta).
Sredstva razrabotki servernyh prilozhenij
Klientskie prilozheniya, lishennye servernoj storony, prigodny dlya resheniya
lish' ogranichennogo klassa zadach. Takie zadachi kak vzaimodejstvie s bazami
dannyh, centralizovannaya obrabotka rezul'tatov i t.p. v bol'shej ili men'shej
stepeni trebuyut nalichiya servernoj storony.
SHirokie vozmozhnosti otkryvayutsya pri ispol'zovanii kombinirovannyh
sistem s razvitym pol'zovatel'skim interfejsom, realizovannom sredstvami
klientskoj storony, i moshchnoj servernoj podderzhkoj.
V to zhe vremya opredelennyj interes predstavlyayut sistemy, osnovannye
preimushchestvenno na servernyh resheniyah. V etom sluchae vse, chto trebuetsya ot
klientskoj storony -- nalichie sredstv dlya raboty s WWW. Vzaimodejstvie s
servernymi prilozheniyami osushchestvlyaetsya posredstvom dinamicheski formiruyushchihsya
ekrannyh HTML-form.
V yazyk HTML vklyucheny bazovye sredstva dlya vzaimodejstviya s
pol'zovatelem -- knopki, polya vvoda, selektornye knopki, spiski. Oni
gruppiruyutsya s pomoshch'yu tega <form>, v parametre action kotorogo ukazyvaetsya
adres prilozheniya, obrabatyvayushchego rezul'taty formy. Parametr method
opisyvaet metod peredachi dannyh na server -- GET ili POST.
HTML-kod, opisyvayushchij formu s odnim voprosom i tremya predlagaemymi na
vybor otvetami, vyglyadit sleduyushchim obrazom:
<p align="center">
<form action="/cgi-bin/process.cgi" method="POST">
Vopros 1<br>
<select name="answer" size="3">
<option value="answer1" selected>Otvet 1</option>
<option value="answer2">Otvet 2</option>
<option value="answer3">Otvet 3</option>
</select><br><br>
<input type="submit" value="Otvetit'">
</form>
CHto privedet k otobrazheniyu v brouzere sleduyushchej stranicy:
Ris. 4. Primer stranicy s formoj dlya vzaimodejstviya s pol'zovatelem
Samyj rasprostranennyj teg, ispol'zuemyj v formah -- <input>. V ego
parametre type ukazyvaetsya tip polya vvoda:
submit/text/password/checkbox/radio/hidden, sootvetstvuyushchij knopkam, prostym
tekstovym polyam vvoda, polyam vvoda parolya, selektornym knopkam, spryatannym
polyam.
V obyazatel'nom parametre name ukazyvaetsya imya polya vvoda, v pole value
mozhno zadat' ego startovoe znachenie.
Spiski i vypadayushchie spiski sozdayutsya s pomoshch'yu tegov <select></select>,
opisyvayushchih harakteristiki vsego spiska, i tegov <option>, opisyvayushchih
otdel'nye elementy spiskov.
V kazhdoj forme dolzhna prisutstvovat' odna knopka Submit, pri nazhatii
kotoroj formiruetsya http-zapros, vklyuchayushchij rezul'taty zapolneniya formy, i
etot zapros napravlyaetsya na vhod prilozheniya, ukazannogo v parametre action.
Pervym mehanizmom, obespechivayushchim vzaimodejstvie klienta s servernymi
prilozheniyami, stal CGI (Common Gateway Interface, obshchij shlyuzovoj interfejs).
V otvet na dejstviya pol'zovatelya, ispol'zuya CGI, Web-server vyzyvaet vneshnyuyu
programmu (CGI-prilozhenie) i peredaet ej informaciyu, poluchennuyu ot klienta
(naprimer, peredannuyu Web-brauzerom). Dalee CGI-prilozhenie obrabatyvaet
poluchennuyu informaciyu, i rezul'taty ee raboty peredayutsya klientu.
Rassmotrim eti etapy chut' podrobnee. Vzaimodejstvie mezhdu klientom i
servernym prilozheniem osushchestvlyaetsya po sheme, predstavlennoj na ris.1.
Ris. 1. Shema vzaimodejstviya brauzera, www-servera i cgi-prilozheniya
Pol'zovatel' zapolnyaet ekrannuyu formu, opisannuyu v html-fajle s pomoshch'yu
tega <form>, i nazhimaet na knopku "Submit". Vozmozhen takzhe zapros pri
neposredstvennom ispol'zovanii adresa CGI-prilozheniya -- ukazyvaya ego v
stroke Location brauzera, v tege <img> s pomoshch'yu sredstv vklyucheniya servera
(SSI) i t. d.
Na osnove informacii iz formy brauzer formiruet HTTP-zapros i
otpravlyaet ego serveru. Informaciya privoditsya k vidu
param1=value1¶m2=value2...¶mN=valueN, gde parami -- imya
sootvetstvuyushchego polya vvoda, valuei -- vvedennoe v nego znachenie. Vse
simvoly, za isklyucheniem bukv latinskogo alfavita, cifr, simvola
podcherkivaniya, defisa i tochki pri etom peredayutsya v zakodirovannom vide %XX,
gde XX -- shestnadcaterichnoe predstavlenie dannogo simvola. Simvol probela
mozhet byt' zamenen simvolom "+". Esli ukazano, chto pri peredache dolzhen
ispol'zovat'sya metod GET, eta stroka peredaetsya neposredstvenno v URL
(naprimer,
<u>http://www.somehost.com/cgi-bin/script.cgi?param1=value1¶m2=value2</u>).
Pri ispol'zovanii metoda POST cherez zagolovok peredaetsya informaciya o tipe
soderzhimogo zaprosa (dlya form eto, kak pravilo,
application/x-www-form-urlencoded), a takzhe dlina stroki. Sama stroka v etom
sluchae peredaetsya neposredstvenno v tele zaprosa (primery privedeny chut'
nizhe). V zagolovkah zaprosa takzhe peredaetsya znachitel'noe kolichestvo
vspomogatel'noj informacii: tip brauzera, adres stranicy, s kotoroj byl
proizveden zapros, i t. d. Vsya eta informaciya peredaetsya v HTTP-zagolovkah,
imeyushchih vid "Imya: znachenie". Otdelyayutsya drug ot druga zagolovki s pomoshch'yu
simvola novoj stroki, zavershaetsya ih spisok eshche odnim simvolov novoj stroki.
Server vyzyvaet CGI-prilozhenie, i v zavisimosti ot metoda zaprosa
peredaet informaciyu iz formy cherez peremennuyu okruzheniya QUERY_STRING (v
sluchae GET) libo cherez standartnyj vvod (v sluchae POST). Takzhe formiruyutsya
drugie peremennye okruzheniya, takie kak HTTP_USER_AGENT, REMOTE_HOST i dr.
Informaciya dlya 'njuj okruzheniya beretsya iz HTTP-zagolovkov.
CGI-prilozhenie schityvaet stroku s peredannoj informaciej so
standartnogo vvoda (stdin) ili iz peremennoj okruzheniya QUERY_STRING.
Obrabotav informaciyu, programma, kak pravilo, libo pereadresuet brauzer na
nekotoryj sushchestvuyushchij dokument s pomoshch'yu http-zagolovka Location, libo
formiruet virtual'nyj dokument, posylaya informaciyu na standartnyj vyvod
(stdout). Telu dokumenta predshestvuyut HTTP-zagolovki, opisyvayushchie tip
vozvrashchaemyh dannyh, upravlyayushchie keshirovaniem, rabotoj s cookies i t. d. Vse
eto peredaetsya serveru.
Server peresylaet otvet CGI-prilozheniya brauzeru, dopolnyaya ih pri
neobhodimosti kodom vozvrata i vspomogatel'nymi zagolovkami. Pri etom
ispol'zuetsya odin iz dvuh sposobov -- perenapravlenie brouzera na novyj
adres s pomoshch'yu http-zagolovka Location, libo formirovanie virtual'nogo
dokumenta. V poslednem sluchae znachenie, peredannoe v zagolovke Content-type,
ispol'zuetsya brouzerom dlya interpretacii idushchej sledom informacii --
naprimer, text/html dlya virtual'nyh html-dokumentov.
Brauzer, osnovyvayas' na zagolovkah HTTP, interpretiruet otvet
CGI-prilozheniya i vyvodit ego dlya prosmotra pol'zovatelem.
Realizovat' CGI-prilozhenie mozhno na lyubom yazyke, sposobnom generirovat'
kod dlya servernoj platformy ili dlya kotorogo dostupen interpretator. Tak,
prostejshee CGI-prilozhenie mozhet byt' realizovano na yazyke paketnyh fajlov
DOS, na Delphi, S/S++, Tcl, Visual Basic, AppleScript, FoxPro, Perl i t. d.
Osnovnye nedostatki klassicheskogo CGI -- kazhdoe vzaimodejstvie klienta
s serverom, vo-pervyh, yavlyaetsya nezavisimym ot predydushchih i posleduyushchih
vzaimodejstvij, vo-vtoryh, privodit k zapusku na servere otdel'nogo
processa. Pervyj nedostatok yavlyaetsya tyazhelym naslediem HTTP-protokola, ne
imeyushchego garantirovanno rabotayushchih sredstv identifikacii klientov, i vse
sushchestvuyushchie resheniya sposobny lish' slegka sgladit' etot nedostatok. Bor'ba
so vtorym nedostatkom idet gorazdo uspeshnee, i vpolne priemlemye resheniya
sushchestvuyut dlya obeih naibolee rasprostranennyh servernyh platform.
Dlya serverov, osnovannyh na Unix-platformah, odnim iz samyh populyarnyh
reshenij yavlyaetsya ispol'zovanie mod_perl -- modulya, integriruyushchego v
web-server Apache interpretator yazyka Perl. |to pozvolyaet rezko umen'shit'
nagruzku na server pri zapuske CGI-prilozhenij, napisannyh na Perl. I eto
tol'ko verhnyaya chast' ajsberga -- mod_perl pozvolyaet razrabotchiku pisat' na
Perl polnocennye podklyuchaemye moduli Apache, chto otkryvaet pered
programmistom dovol'no shirokie vozmozhnosti. Drugim populyarnym resheniem
yavlyaetsya PHP -- skriptovyj yazyk, vstraivaemyj neposredstvenno v telo
html-stranicy. Pered tem, kak otoslat' html-dokument klientu, server
prosmatrivaet ego na predmet nahozhdeniya v nem pary upravlyayushchih tegov PHP <?
i ?>. Tekst, nahodyashchijsya vnutri etih skobok, rassmatrivaetsya kak kod PHP,
peredaetsya na obrabotku interpretatoru, i klientu vozvrashchaetsya rezul'tat ego
raboty. Sintaksis yazyka ochen' napominaet C, tak chto osvoit' ego ne
predstavlyaet osobogo truda.
Resheniya dlya Windows-platform napominayut svoih Unix-sobrat'ev. V
Microsoft Internet Information Server (IIS) realizovana podderzhka tehnologij
ISAPI i Active Server Pages (ASP). ISAPI-prilozheniya predstavlyayut soboj
dinamicheskie biblioteki, zagruzhaemye v adresnoe prostranstvo servera. Pri
vyzove prilozheniya ne proishodit zapusk novogo processa, za schet chego
dostigaetsya rost effektivnosti i snizhenie nakladnyh rashodov. S drugoj
storony, nekorrektno napisannoe ISAPI-prilozhenie mozhet stat' prichinoj otkaza
ot raboty vsego web-servera (vprochem, nachinaya s IIS4 poyavilas' vozmozhnost'
borot'sya s etim nedostatkom).
Tehnologiya ASP analogichna PHP -- kak i tam, tekst, nahodyashchijsya vnutri
upravlyayushchih tegov ASP (<% i %>), peredaetsya na obrabotku interpretatoru,
realizovannomu, kstati, v vide ISAPI-prilozheniya. Programma, razmeshchennaya na
aktivnoj stranice, mozhet byt' sostavlena na odnom iz yazykov podgotovki
scenariev -- takim kak JavaScript ili VBScript, znakomym nam po
dinamicheskomu HTML. Glavnoe otlichie ot ih ispol'zovaniya v dinamicheskom HTML
-- na etot raz oni vypolnyayutsya serverom i imeyut gorazdo bol'shie vozmozhnosti
po rabote s dannymi. Vozmozhno rasshirenie vozmozhnostej ASP, naprimer, dlya
obmena informaciej s bazoj dannyh s pomoshch'yu sloya servernyh ActiveX-ob容ktov.
Dal'nejshee razvitie eta tehnologiya poluchit v gotovyashchejsya k vypusku platforme
.NET, odna iz treh osnovnyh sostavlyayushchih kotoryh tak i nazyvaetsya, Active
Server Pages+, i vryad li budet predstavlyat' iz sebya chto-to principial'no
novoe.
Perechislennye chetyre tehnologii ne ischerpyvayut spisok sredstv dlya
sozdaniya servernyh web-prilozhenij, prizvannyh spravit'sya s nedostatkami CGI
-- pomimo nih sushchestvuyut takie tehnologii kak Java Servlets, FastCGI,
ColdFusion i t.p. Odnako vse oni zatragivayut tol'ko odno zveno cepochki
klient-server-servernoe prilozhenie -- a imenno sposob peredachi informacii ot
servera k servernomu prilozheniyu i obratno. Principy postroeniya samih
servernyh prilozhenij ochen' pohozhi, a vzaimodejstvie mezhdu klientom i
serverom osushchestvlyaetsya po-prezhnemu s pomoshch'yu tega <form> i peredachi
informacii, sobrannoj v odnu stroku.
SHirokoe rasprostranenie v kachestve yazyka dlya CGI-prilozhenij poluchil
Perl. Ego sintaksis unasledovan v pervuyu ochered' ot S, v nego dobavleny
rasshirennye sredstva dlya raboty so strokami, regulyarnymi vyrazheniyami,
associativnymi massivami i t. d. |to interpretiruemyj yazyk, iznachal'no
sozdannyj dlya Unix-sistem, sejchas ego interpretatory dostupny dlya
bol'shinstva populyarnyh arhitektur, chto delaet osobenno legkim perenos
prilozhenij. Bylo by neverno govorit' o Perl, kak isklyuchitel'no o sredstve
razrabotki CGI. Vstroennye v yazyk vozmozhnosti, velikolepnaya perenosimost',
ogromnoe kolichestvo sushchestvuyushchih bibiliotek, dostupnyh iz Comprehensive Perl
Archive Network (CPAN, <u>http://www.perl.com/CPAN/)</u>, delayut ego
isklyuchitel'no udobnym sredstvom dlya sistemnogo administrirovaniya, setevogo
programmirovaniya, obrabotki tekstov i t.p.
Osnovy yazyka: skalyary, massivy, heshi, ssylki
Perl-programma predstavlyaet soboj fajl, soderzhashchij nabor
Perl-operatorov, i nachinayushchijsya so strochki vida #!/usr/bin/perl ,
ukazyvayushchej put' do interpretatora Perl. |to spravedlivo dlya Unix-sistem,
trebuyushchih, krome togo, ustanovki bita ispolneniya v atributah dannogo fajla,
dlya windows-realizacij podobnaya strochka neobyazatel'na, no zhelatel'na iz
soobrazhenij perenosimosti (Apache/Win32, k primeru, ne smozhet zapustit'
CGI-skript s nekorrektnym putem do interpretatora).
Sintaksis yazyka ochen' pohozh na sintaksis C, no s neznachitel'nymi
isklyucheniyami. Tochki vhoda v vide funkcii s predopredelennym imenem net,
peremennye po umolchaniyu imeyut global'nuyu oblast' vidimosti i ne dolzhny byt'
opisany pered ispol'zovaniem, chto pozvolyaet bystro "slepit'" rabotayushchuyu
programmu, kotoruyu prakticheski nevozmozhno podderzhivat'. Tak chto horoshim
resheniem vse zhe yavlyaetsya ispol'zovanie funkcij i opisanie peremennyh pered
ispol'zovaniem, a zaodno i ispol'zovanie direktivy use strict, ne
pozvolyayushchej programmistu zabyt' o podobnyh melochah. Parametry vstroennyh
funkcij mogut zaklyuchat'sya v kruglye skobki, a mogut i ne zaklyuchat'sya, tak
chto ih ispol'zovanie -- lish' vopros stilya, i sleduyushchie strochki ekvivalentny:
print "Hello, World\n";
print ("Hello, World\n");
Kommentariem sluzhit simvol #, ego dejstvie rasprostranyaetsya do konca
stroki. Mnogostrochnyh kommentariev net.
Skalyarnye velichiny v Perl byvayut dvuh tipov -- chislovogo i strokovogo.
Dlya vseh chisel ispol'zuetsya odno i to zhe vnutrennee predstavlenie -- chislo s
plavayushchej tochkoj dvojnoj tochnosti (to, chto kompilyator S, kotorym
kompilirovalsya Perl, ponimal pod double). Stroki predstavlyayut soboj
posledovatel'nosti simvolov, no ne yavlyaetsya massivom bajtov i ne
ogranichivaetsya kakim-to special'nym simvolom tipa nulevogo, kak eto
proishodit v S. Po mere neobhodimosti osushchestvlyaetsya preobrazovanie iz
odnogo tipa v drugoj -- v zavisimosti ot konteksta stroka mozhet prevratit'sya
v chislo i naoborot:
print "2"*2; # vyvodit 4
Imya skalyarnoj peremennoj vsegda nachinaetsya s simvola $:
$a = 1;
Skalyarnaya velichina mozhet byt' opredelennoj i neopredelennoj, v
poslednem sluchae ee znachenie ravno undef. V strokovom kontekste znachenie
undef interpretiruetsya kak pustaya stroka "", dlya proverki opredelennosti
peremennoj sleduet pol'zovat'sya funkciej defined. Pri ispol'zovanii v
logicheskih operaciyah lozhnymi schitayutsya chislo 0 i stroki "" i "0".
Stroki mogut zapisyvat'sya s ispol'zovaniem odinarnyh i dvojnyh kavychek.
Pri ispol'zovanii odinarnyh kavychek ih soderzhimoe ispol'zuetsya kak est':
print '12\n$a'; # pechataet stroku 12\n$a
Pri ispol'zovanii dvojnyh kavychek proishodit tak nazyvaemaya
interpolyaciya peremennyh i specsimvolov:
print "12\n$a"; # pechataet 12, delaet perevod stroki, pechataet znachenie
peremennoj $a
Esli v takoj stroke neobhodimo predotvratit' podstanovku znacheniya
vmesto imeni peremennoj, to pered znakom dollara neobhodimo postavit'
obratnuyu kosuyu chertu: "\$a".
Operacii nad chislovymi znacheniyami nichem ne otlichayutsya ot znakomyh po S
(za isklyucheniem vozvedeniya v stepen' **, operacij not, and, or, dubliruyushchih
operacii !, &&, ||, no imeyushchih men'shij prioritet, chem operacii prisvaivaniya,
i operacii xor, oznachayushchej logicheskoe isklyuchayushchee ILI). Dlya strokovyh
peremennyh opredeleny operaciya konkatenacii "." (tochka), operaciya povtoreniya
"x", operacii ne (neravenstvo strok), eq (ravenstvo), lt (strokovoe "bol'she
chem") i gt (strokovoe "men'she chem"). Takzhe opredelena operaciya sravneniya
dvuh strok cmp, vozvrashchayushchaya --1, 0 ili 1, ob容dinyayushchaya proverki ravenstva i
sravneniya, i analogichnaya ej operaciya dlya chisel <=>.
Vstroennaya funkciya chop udalyaet poslednej simvol stroki, vstroennaya
funkciya chomp udalyaet poslednij simvol, esli on yavlyaetsya simvolom
razdelitelya vhodnyh zapisej (znachenie po umolchaniyu -- simvol novoj stroki
\n, kotoroe mozhet byt' zameneno prisvaivaniem novogo znacheniya vstroennoj
peremennoj $\).
Poisk podstroki osushchestvlyaetsya funkciej index($stroka, $podstroka,
$start), vozvrashchayushchej indeks pervogo vhozhdeniya podstroki v stroku, bol'shego
chem $start (tretij parametr mozhno opustit') i funkciej rindex, delayushchej to
zhe samoe, no prosmatrivayushchej stroku sprava nalevo. Izvlekaetsya podstroka iz
stroki funkciej substr ($stroka, $nachalo, $dlina). Pri otsutstvii tret'ego
parametra budut izvlecheny vse simvoly do konca stroki. |ta funkciya mozhet
stoyat' v levoj chasti operatora prisvaivaniya, pozvolyaya tem samym izmenyat'
chast' stroki na letu.
Massivy v Perl mogut hranit' lyuboe kolichestvo elementov i uvelichivayutsya
po mere neobhodimosti. Imena massivov nachinayutsya s simvola @: @a, dostup k
otdel'nomu elementu massiva zapisyvaetsya v vide $a[10] (numeraciya elementov
massiva nachinaetsya s 0, prichem poslednij element massiva imeet indeks --1,
predposlednij --2 i t.d.). V zavisimosti ot spisochnogo ili skalyarnogo
konteksta raznye funkcii mogut vesti sebya po raznomu -- tak, funkciya chomp v
primenenii k massivu udalit poslednij simvol u kazhdogo elementa massiva, a
@a v skalyarnom kontekste vernet kolichestvo elementov massiva.
Pri obrashchenii k elementu, nahodyashchemusya za predelami massiva, budet
vozvrashcheno znachenie undef, pri prisvaivanii znacheniya takomu elementu massiv
avtomaticheski uvelichitsya, a vse promezhutochnye elementy poluchat znachenie
undef.
Inicializiruyutsya massivy spisochnymi dannymi, kotorye zapisyvayutsya v
vide zaklyuchennoj v kruglye skobki posledovatel'nosti znachenij, otdelennyh
drug ot druga zapyatymi:
@a = (0, $a, 5, "123", @b);
Pri etom vstavlennye takim obrazom elementy massiva @b nahodyatsya na tom
zhe urovne ierarhii, chto i drugie elementy spiska, t.e. prosto dopisyvayutsya v
konec massiva @a.
Prisvaivanie spiskov pozvolyaet osushchestvlyat' dovol'no lyubopytnye
operacii:
($a, $b, $c, @e) = ($b, $a, @g);
$a i $b obmenyayutsya znacheniyami, $c budet prisvoeno znachenie pervogo
elementa massiva @g, ostal'nye elementy budut skopirovany v massiv @e.
Srez massiva pozvolyaet vybrat' iz nego za odin raz neskol'ko elementov:
@a[0, 1, 10];
|tu zhe operaciyu mozhno primenit' k spisku:
($a, $b, $c, $d)[0, 1];
|ta tehnika ispol'zuetsya, k primeru, dlya polucheniya informacii o
vremeni: funkciya localtime preobrazuet rezul'tat, vozvrashchaemyj funkciej time
(vremya v sekundah ot 1.01.1970), v zavisimosti ot konteksta, libo v stroku
vida "Fri Sep 15 11:12:13 2000", libo v massiv iz devyati elementov (sekundy,
minuty, chasy, den', mesyac, god, den' nedeli, den' goda, priznak letnego
vremeni):
($day, $month, $year) = (localtime(time))[3, 4, 5];
Sleduet otmetit', chto mesyacy, dni goda i dni nedeli nachinayutsya s nulya,
prichem nulevym dnem nedeli schitaetsya voskresen'e, a gody schitayutsya ot 1900
goda. Takim obrazom, 2000 godu sootvetstvuet znachenie 100 (iz-za togo, chto
mnogie programmisty zabyli etot fakt, v nachale 2000 goda na raznyh stranicah
seti mozhno bylo nablyudat' datu vida 1.01.100 ili 1.01.19100).
Pri zapisi spiskov vmesto operacii "," mozhno vospol'zovat'sya => :
zapis' ("one", 1, "two", 2, "three", 3) ekvivalentna (one => 1, two
=>2, three => 3), chto mozhet sdelat' spisok bolee naglyadnym.
Dlya raboty s massivom kak so stekom ispol'zuyutsya funkciya push,
dobavlyayushchaya elementy (odin ili neskol'ko) v konec massiva, i funkciya pop,
udalyayushchaya poslednij element. Dlya raboty s nachalom massiva ispol'zuyutsya
analogichnye funkcii unshift i shift. Po umolchaniyu vse eti funkcii rabotayut s
vstroennym massivom @_.
Funkciya reverse menyaet poryadok sledovaniya elementov spiska-argumenta na
obratnyj i vozvrashchaet rezul'tat. Funkciya sort po umolchaniyu sortiruet
argumenty po vozrastaniyu, rassmatrivaya ih kak strokovye peremennye.
Pomimo prostyh massivov, v Perl sushchestvuyut associativnye massivy, ili
heshi. Ih otlichie ot prostyh massivov v tom, chto indeksami yavlyayutsya ne
posledovatel'nye celye chisla, a proizvol'nye skalyarnye velichiny.
Inicializiruyutsya heshi spiskom, chetnye elementy kotorogo (nachinaya s nulya),
yavlyayutsya indeksom, chetnye -- znacheniem, i nachinayutsya s simvola %:
%a = (one => 1, two =>2, three => 3);
Dostup k elementu hesha zapisyvaetsya kak $a{1} (v nashem primere vernet
"one").
Funkciya key vozvrashchaet spisok klyuchej peredannogo ej hesha, funkciya
values -- spisok znachenij. Funkciya each posledovatel'no prohodit po heshu,
vozvrashchaya paru klyuch-znachenie v vide spiska iz dvuh elementov. Udalit'
element hesha mozhno funkciej delete:
delete $a{1};
Predstavit' sebe sovremennyj yazyk programmirovaniya, ne imeyushchij
ssylochnyh tipov dannyh, nevozmozhno. Ne obdelen imi i Perl. Zdes' mozhno
poluchit' ssylku na lyuboj iz vstroennyh tipov, i prisvoit' ee nekotoroj
skalyarnoj peremennoj:
$ref1 = \$var;
$ref2 = \@array;
$ref3 = \%hash;
Dlya dostupa k skalyarnym peremennym, na kotoryh ssylaetsya ssylka, mozhno
vospol'zovat'sya sleduyushchimi konstrukciyami:
$$ref1;
${$ref1};
$ref2->[12];
${$ref2}[12];
$$ref2[12];
$ref3->{$key};
${$ref3}{$key};
$$ref3{$key};
Kak pravilo, predpochitayut ispol'zovat' konstrukcii s operatorom ->,
delayushchie kod bolee chitabel'nym.
Mozhno takzhe sozdat' ssylku na anonimnyj massiv ili hesh:
$aref = [1, 2, 3];
$href = {1 => One, 2 => Two, 3 => Three};
S pomoshch'yu ssylok mozhno formirovat' dovol'no slozhnye struktury dannyh
(naprimer, massiv ssylok na heshi).
Upravlyayushchie struktury i funkcii
Dlya upravleniya potokom ispolneniya programmy ispol'zuyutsya operatory
vetvleniya i cikla, analogichnye sushchestvuyushchim v S. Prichem obyazatel'nym
usloviem yavlyaetsya ispol'zovanie bloka operatorov, zaklyuchennyh v figurnye
skobki. Poslednij operator v bloke mozhet ne imet' zavershayushchej tochki s
zapyatoj:
if($a>$max) {$max = $a}
Obshchaya forma operatora if:
if(uslovie 1)
{...}
elsif(uslovie 2)
{...}
elsif(uslovie 3)
{...}
...
else
{...}
Vmesto konstrukcii if(!uslovie) mozhno ispol'zovat' unless(uslovie), a
dlya uproshcheniya zapisi vmesto konstrukcii if(uslovie){operator} mozhno
ispol'zovat' operator if uslovie.
V kachestve upravlyayushchih struktur chasto ispol'zuyutsya operacii && i ||:
Zapis' if(vyrazhenie){operator} ekvivalentna zapisi vyrazhenie &&
operator, a zapis' unless (vyrazhenie){operator} -- zapisi vyrazhenie ||
operator. Vybor toj ili inoj formy polnost'yu zavisit ot nastroeniya
programmista.
Operatory cikla takzhe chut' bolee raznoobrazny, chem v S: vmesto
while(!uslovie){} mozhno zapisat' until(uslovie){}, analogichno i dlya cikla s
post-usloviem. Dlya sokrashcheniya zapisi takzhe ispol'zuetsya konstrukciya operator
while vyrazhenie.
Pomimo operatora for, nichem ne otlichayushchegosya ot S, sushchestvuet operator
foreach, kotoryj zapisyvaetsya kak
foreach $i(@spisok)
{}
V etom sluchae skalyarnaya peremennaya $i posledovatel'no prinimaet
znacheniya elementov spiska. Naprimer, perebrat' vse elementy hesha,
otsortirovannye po klyucham, mozhno tak:
foreach $i(sort keys %a)
{
print $a{$i}."\n";
}
Pri prohode po bol'shomu heshu effektivnee ispol'zovat' funkciyu each --
cenoj poteri sortirovki:
while(($key, $value) = each(%a))
{
}
Dlya vseh operatorov cikla, krome cikla s post-usloviem, sushchestvuyut
operatory last, preryvayushchij vypolnenie cikla, next, perehodyashchij k sleduyushchej
iteracii, i redo, obespechivayushchij perehod v nachalo tekushchego bloka bez
proverki usloviya. Ih mozhno ispol'zovat' v sochetanii s metkami:
OUTER: while(uslovie 1)
{
INNER: while(uslovie 2)
{
if(uslovie 3)
{
next OUTER; #perehod na sleduyushchuyu iteraciyu vneshnego cikla
}
}
}
Funkcii zapisyvayutsya sleduyushchim obrazom:
sub f
{
}
i vyzyvayutsya kak f();
Znachenie iz funkcii vozvrashchaetsya operatorom return, pri otsutstvii ego
vozvrashchaemym znacheniem yavlyaetsya rezul'tat poslednej vyrazheniya, vychislennogo
v funkcii. Pri peredache parametrov v funkciyu oni zanosyatsya vo vstroennuyu
peremennuyu @_, dostup k elementam kotoroj mozhno poluchit' kak k elementam
obychnogo massiva: $_[0] i t.p., a takzhe cherez funkcii shift, pop i t.p.
Takim obrazom, funkcii mogut imet' peremennoe kolichestvo parametrov.
Peremennye, ispol'zuemye v funkciyah, po umolchaniyu imeyut global'nuyu
oblast' vidimosti:
sub f
{
$a++;
}
$a = 1;
f();
print $a; # napechataet 2
Dlya togo, chtoby sdelat' peremennuyu lokal'noj, nado ob座avit' ee s
pomoshch'yu operatora my:
sub f
{
my $a;
$a++;
}
$a = 1;
f();
print $a; # napechataet 1
Rasprostranennym priemom yavlyaetsya inicializaciya parametrov funkcii,
imeyushchih osmyslennye imena:
my($param1, $param2) = @_;
Pri nalichii direktivy use strict ob座avlenie peremennyh s pomoshch'yu
operacii my yavlyaetsya obyazatel'nym.
Krome direktivy my sushchestvuet pohozhaya na nee direktiva local. Raznica
mezhdu nimi sleduyushchaya: my ogranichivaet oblast' dejstviya peremennoj tekushchim
blokom, local zhe delaet etu peremennuyu dostupnoj i vo vseh funkciyah, kotorye
vyzyvayutsya iz tekushchego bloka.
Teper', nauchivshis' rabotat' s funkciyami, my mozhem ispol'zovat'
sortirovku s proizvol'nym kriteriem.
sub by_num
{
return $a <=> $b;
}
foreach $i(sort by_num keys %a)
{
print $a{$i}."\n";
}
Funkciya by_num opredelyaet kriterij sortirovki, a peremennye $a i $b,
peredavaemye v nee, yavlyayutsya vstroennymi i lokal'nymi dlya nee peremennymi.
To zhe samoe mozhno zapisat' eshche koroche, ispol'zuya anonimnuyu funkciyu:
foreach $i(sort {$a <=> $b} keys %a)
{
print $a{$i}."\n";
}
Mozhno sozdat' ssylku na funkciyu:
sub func{...}
$fref1 = \&func;
$fref2 = sub {...}; # Ssylka na anonimnuyu funkciyu
Ispol'zuetsya eta ssylka kak $fref1->(spisok argumentov).
Vvod-vyvod
Vvod s konsoli osushchestvlyaetsya s pomoshch'yu operatora <STDIN>:
$a = <STDIN>; # schityvaet sleduyushchuyu stroku do simvola
#perevoda stroki
# (tochnee, do znacheniya, prisvoennogo peremennoj $/)
# libo undef, esli strok bol'she net
@a = <STDIN>; # schityvaet vse stroki do zaversheniya vvoda (obychno --
# nazhatie Ctrl-Z); kazhdaya strochka budet zavershat'sya
# simvolom perevoda stroki
while(<STDIN>) {...} #posledovatel'no schityvaet stroki v
#vstroennuyu peremennuyu $_.
Vyvod na konsol' osushchestvlyaetsya s pomoshch'yu funkcii print,
formatirovannyj vyvod -- s pomoshch'yu printf, polnost'yu analogichnoj
sootvetstvuyushchej funkcii S. Esli u print ne ukazan parametr, vyvoditsya
soderzhimoe vstroennoj peremennoj $_.
Dlya vvoda iz fajlov, perechislennyh v komandnoj stroke skripta,
ispol'zuetsya operaciya <>:
while(<>){...}
Esli v kachestve parametrov peredano neskol'ko imen fajlov, operaciya <>
schitaet ih vseh posledovatel'no.
Dlya fajlovogo vvoda-vyvoda snachala neobhodimo svyazat' s fajlom
deskriptor. Standartnye deskriptory STDIN, STDOUT, STDERR uzhe svyazany so
standartnym vvodom, standartnym vyvodom i standartnym vyvodom oshibok, krome
togo, sushchestvuet special'nyj deskriptor DATA, pozvolyayushchij schitat' tekst,
sleduyushchij posle simvolov __END__ iz fajla, v kotorom nahoditsya sama
programma.
Dlya otkrytiya dopolnitel'nyh deskriptorov ispol'zuetsya funkciya open:
open(FILE1, "filename"); # otkryvaet fajl dlya chteniya
open(FILE2 ">filename"); # otkryvaet fajl dlya zapisi
open(FILE3, ">>filename"); # otkryvaet fajl dlya dobavleniya
Pri neudachnom otkrytii fajla funkciya open vozvrashchaet znachenie "lozh'",
tak chto pravilom horoshego tona yavlyaetsya proverka etogo znacheniya:
open (FILE, "filename") || die "cannot open file: $!";
Funkciya die vyzyvaet avarijnoe zavershenie programmy, peremennaya $!
soderzhit stroku s opisaniem poslednej oshibki.
Posle zaversheniya raboty fajl neobhodimo zakryt':
close (FILE);
Imena deskriptorov ne nachinayutsya s kakih-to special'nyh simvolov, i
obshcheprinyato vvodit' ih zaglavnymi bukvami -- prosto, chtoby otlichit' ot
obychnyh peremennyh.
Dalee ih mozhno ispol'zovat' v sochetanii s operaciej <> dlya vvoda:
@a = <FILE>; # Ckladyvaet vse strochki fajla v massiv strok. Mozhet
# okazat'sya ne samym luchshim resheniem, esli fajl imeet
# bol'shoj razmer
Dlya vyvoda v otkrytyj fajl ego deskriptor zapisyvaetsya srazu posle
klyuchevogo slova print. Zapyatoj mezhdu deskriptorom i drugimi argumentami byt'
ne dolzhno:
print FILE "some text\n";
Dlya proverki sushchestvovaniya fajla ispol'zuetsya operaciya "-e": if(-e
$filename){...}. Sushchestvuyut takzhe operacii dlya proverki, dostupen li etot
fajl dlya chteniya (-r), dostupen li dlya zapisi (-w), yavlyaetsya li on katalogom
(-d) ili obychnym fajlom (-f) i t.d.
Ves'ma udobnoj yavlyaetsya vstroennaya v Perl podderzhka DBM-fajlom,
pozvolyayushchaya svyazat' associativnyj massiv s DBM-bazoj. Rodnaya dlya Unix-sistem
biblioteka DBM predostavlyaet v rasporyazhenie programmista prostuyu i udobnuyu
bazu dannyh. Sushchestvuyut razlichnye realizacii DBM, razlichayushchiesya vozmozhnym
razmerom zapisi, bazy, skorost'yu raboty i t.p. V prostejshem variante svyaz'
hesha s DBM-fajlom osushchestvlyaetsya funkciej dbmopen, a zakryvaetsya DBM-fajl
funkciej dbmclose:
dbmopen(%A, "basename", 0644)
dbmclose(%A);
Tretij parametr funkcii dbmopen ukazyvaet, s kakimi pravami dostupa
sozdavat' fajl, esli ego ne sushchestvuet. Esli net neobhodimosti sozdavat'
fajl, vmesto etogo parametra mozhno peredat' undef.
Dlya bolee polnoj informacii vospol'zujtes' komandoj perldoc
AnyDBM_File.<u></u>
Regulyarnye vyrazheniya horosho znakomy opytnym pol'zovatelyam Unix, oni
ispol'zuyutsya dlya obrabotki teksta vo mnogih Unix-utilitah, takih kak grep,
awk, sed, v redaktorah (vi, emacs), v nekotoryh komandnyh obolochkah i t. d.
Regulyarnoe vyrazhenie predstavlyaet soboj obrazec, ili shablon, kotoryj
sopostavlyaetsya so strokoj. |to sopostavlenie, ili poisk po shablonu, mozhet
zakonchit'sya uspehom, ili neudachej. Krome togo, sovpadayushchij obrazec mozhet
byt' zamenen drugoj strokoj ili skopirovan vo vneshnyuyu peremennuyu.
Po umolchaniyu regulyarnye vyrazheniya ispol'zuyut vstroennuyu peremennuyu $_,
no mozhno sopostavit' s shablonom lyubuyu druguyu skalyarnuyu peremennuyu s pomoshch'yu
operatorov =~ i !~:
/tekst/; # vozvrashchaet istinu, esli v $_ soderzhitsya
# podstroka "tekst"
$s =~ /tekst/; # vozvrashchaet istinu, esli v $s soderzhitsya
# podstroka "tekst"
$s !~ /tekst/; # vozvrashchaet istinu, esli v $s net podstroki "tekst"
Dlya zameny podstroki, sootvetstvuyushchej shablonu, ispol'zuetsya zapis' vida
s/tekst1/tekst2/;
Vozmozhno ispol'zovanie modifikatorov, naprimer:
/tekst/i; # ignorirovat' registr
s/$s/tekst/g; # proizvodit' global'nuyu zamenu
V privedennyh primerah my ispol'zovali prostejshij obrazec, sostoyashchij iz
posledovatel'nosti obychnyh simvolov. Odnako vozmozhny i bolee slozhnye
kombinacii. Samyj prostoj simvol sopostavleniya -- tochka ("."). Ona
sootvetstvuet lyubomu odinochnomu simvolu, krome simvola novoj stroki. Mozhno
zadat' klass simvolov sopostavleniya s pomoshch'yu spiska, zaklyuchennogo v
kvadratnye skobki:
/[abvgde]/;
|tomu obrazcu sootvetstvuet stroka, soderzhashchaya odin iz etih shesti
simvolov. Diapazon simvolov zadaetsya s pomoshch'yu defisa (sam defis vstavlyaet v
spisok kak \-), simvol "^", stoyashchij srazu za otkryvayushchej skobkoj, oznachaet
otricanie -- takomu klassu simvolov sootvetstvuet lyuboj simvol,
otsutstvuyushchij v etom spiske. Nekotorye rasprostranennye klassy simvolov
imeyut predopredelennye oboznacheniya:
\d [0-9] cifra
\w [a-zA-Z0-9_] obychnyj simvol
\s [ \r\t\n\f] probel'nyj simvol
\D [^0-9] necifrovoj simvol
\W [^a-zA-Z0-9_] special'nyj simvol
\S [^ \r\t\n\f] neprobel'nyj simvol
Odnako samoe interesnoe nachinaetsya pri rabote s obrazcami dlya grupp
simvolov, ili mnozhitelyami. Dva osnovnyh obrazca zdes' -- zvezdochka "*" i
plyus "+". Zvezdochke sootvetstvuet ni odnogo ili bolee ekzemplyarov stoyashchego
pered nej simvola ili klassa simvolov, plyusu -- odin ili bolee ekzemplyarov.
Obrazcu "?" sootvetstvuet ni odnogo ili odin simvol, stoyashchij pered nim v
shablone, nakonec, s pomoshch'yu figurnyh skobok mozhno zadat' tochnoe kolichestvo
povtorenij etogo simvola, ili diapazon.
/ab*/; # stroki, soderzhashchie a, ab, abb, abbb i t.d.
/ab+/; # ab, abb, abbb i t.d.
/ab?/; # a, ab
/ab{2}/; # abb
/ab{2,4}/; # abb, abbb, abbbb
/ab{2,}/; # abb, abbb, abbbb i t.d.
Poisk po shablonu s mnozhitelyami harakterizuetsya tremya osobennostyami:
"zhadnost'yu", "toroplivost'yu" i vozvratom. "ZHadnost'" oznachaet, chto esli
shablon mozhet sovpast' so strokoj v neskol'kih variantah, to vybiraetsya samyj
dlinnyj:
$s = 'abbbbb';
$s =~ s/a.*b/c/; #rezul'tiruyushchaya stroka budet soderzhat' tol'ko "s".
Lyuboj mnozhitel' mozhno prevratit' iz "zhadnogo" v "lenivyj", postaviv
srazu posle nego voprositel'nyj znak:
$s = 'abbbbb';
$s =~ s/a.*?b/c/; #rezul'tiruyushchaya stroka soderzhit "cbbbb".
"Toroplivost'" oznachaet, chto mehanizm poiska stremitsya obnaruzhit'
sovpadenie kak mozhno skoree -- tak, shablonu /a*/ budet sootvetstvovat' lyubaya
stroka, poskol'ku * -- eto 0 ili bolee simvolov.
Nakonec, vozvrat obespechivaet sovpadenie so strokoj ne tol'ko chasti
regulyarnogo vyrazheniya, a vsego shablona. T.e. esli nachalo shablona sovpadaet
so strokoj, a odna iz posleduyushchih chastej -- net, mehanizm poiska
vozvrashchaetsya k nachalu i pytaetsya najti novoe sovpadenie.
Esli chasti shablona zaklyucheny v kruglye skobki, to vklyuchaetsya mehanizm
zapominaniya, i chasti stroki, kotorye im sootvetstvuyut, budut posledovatel'no
prisvaivat'sya peremennym $1, $2, $3 i t.p.:
$s = 'abbbbb';
$s =~ s/a(.*)b/c/; # v $1 budet nahodit'sya stroka "bbbb"
Drugoj sposob zapominaniya chasti stroki -- ispol'zovanie kodov \1, \2 i
t.p. neposredstvenno v shablone:
$s = 'abbbbb';
$s =~ s/a(.*)b/\1c/; # rezul'tiruyushchaya stroka soderzhit "bbbbc"
Vozmozhno ispol'zovanie odnogo iz neskol'kih shablonov:
/tekst1|tekst2|tekst3/
a takzhe ih kombinaciya s pomoshch'yu skobok:
/(a|b)c/;
CHtoby ne vklyuchat' zdes' rezhim zapominaniya, ispol'zuyut zapis'
/(?:a|b)c/;
Obrazec mozhet byt' zafiksirovan otnositel'no pozicii v stroke: /^a.*b$/
sootvetstvuet stroke, nachinayushchejsya s a i zakanchivayushchejsya b, a direktiva \b
trebuet, chtoby sovpadenie s obrazcom proishodila tol'ko na granice slova.
Esli v obrazce uchastvuet peremennaya, to pered sopostavleniem proishodit
ee interpolyaciya, takim obrazom, mozhno stroit' regulyarnoe vyrazhenie na
osnovanii stroki vvedennoj pol'zovatelem. CHut' pozzhe v etoj glave budet
pokazana opasnost' etogo podhoda, poka zhe otmetim, chto dlya otmeny
interpolyacii ispol'zuetsya upravlyayushchaya posledovatel'nost' \Q...\E,
predvaryayushchaya vse specsimvoly v stroke obratnoj kosoj chertoj i prevrashchayushchaya
ih tem samym v prostye simvoly:
/\Q$var\E/
Direktiva tr pozvolyaet zamenit' vse vhozhdeniya simvolov iz spiska v
stroke na drugie:
$s =~ tr/abcde/ABCDE/;
Parametr /e zastavlyaet rassmatrivat' zamenyayushchuyu stroku direktivy s kak
Perl-vyrazhenie:
$s =~ s/(.)/sprintf("[%s]", $1)/eg;
(bespoleznyj primer, rasstavlyayushchij kvadratnye skobki vokrug kazhdogo
simvola stroki i demonstriruyushchij rabotu funkcii formatnogo vyvoda v stroku
sprintf).
Regulyarnye vyrazheniya ochen' udobno ispol'zovat' dlya razbivki stroki na
sostavlyayushchie -- naprimer, znachenie, hranyashcheesya v DBM-fajle, udobno razbit'
na polya, symitirovav bolee slozhnuyu tablicu. Dlya etogo v Perl sushchestvuet
funkciya split. Pervyj ee parametr -- regulyarnoe vyrazhenie, rassmatrivayushcheesya
kak razdelitel' stroki, idushchej vtorym parametrom. Vse elementy stroki, ne
sovpadayushchie s regulyarnym vyrazheniem, posledovatel'no pomeshchayutsya v massiv,
vozvrashchaemyj funkciej split:
$s = 'abc:def:ghi';
@a = split(/:/, $s); # massiv @a budet soderzhat' tri elementa -- "abc",
"def", "ghi".
Esli ne ukazan vtoroj parametr, rabota idet s peremennoj $_. Esli ne
ukazan i pervyj parametr, ispol'zuetsya obrazec /\s+/.
Obratnaya funkciya -- join -- beret spisok znachenij i skleivaet ih,
vstavlyaya mezhdu nimi stroku-svyazku, peredannuyu ej v pervom parametre:
$s = join(":", @a);
Regulyarnye vyrazheniya yavlyayutsya, pozhaluj, samym moshchnym sredstvom Perl,
prednaznachennym dlya obrabotki tekstov, i v nashem kratkom izlozhenii my daleko
ne ischerpali vse ih vozmozhnosti.
Pakety, biblioteki, moduli, klassy i ob容kty
Pakety prednaznacheny dlya razdeleniya global'nogo prostranstva imen. Po
umolchaniyu vse programmy vypolnyayutsya v pakete main, poka direktiva package ne
vybiraet drugoj paket. Dlya dostupa k imenam, opisannym v drugom pakete,
ispol'zuetsya sintaksis $ImyaPaketa::ImyaPeremennoj.
Moduli predstavlyayut soboj otdel'nye fajly, soderzhashchie nabor
vzaimosvyazannyh funkcij. Kazhdyj modul' imeet vneshnij interfejs i, kak
pravilo, opisyvaet svoi global'nye peremennye i funkcii v otdel'nom pakete.
K osnovnoj programme moduli podklyuchayutsya s pomoshch'yu direktiv use i
require. Direktiva use podklyuchaet modul' na etape kompilyacii programmy (hotya
Perl formal'no i yavlyaetsya interpretiruemym yazykom, neposredstvenno pered
ispolneniem proishodit kompilyaciya ishodnyh tekstov programmy), direktiva
require zagruzhaet modul' vo vremya vypolneniya.
Formal'no v Perl net sredstv dlya sozdaniya sostavnyh tipov dannyh
napodobie struktur ili klassov v S++, no imeyushchihsya v nem sredstv vpolne
dostatochno dlya ih dovol'no blizkoj imitacii.
Obychnye struktury imitiruyutsya v Perl s pomoshch'yu anonimnyh heshej:
$record = {
NAME => 'record1',
FIELD1 => 'value1',
FIELD2 => 'value2',
FIELD3 => 'value3',
};
print $record->{FIELD1};
$records{$record->{NAME}} = $record;
$records{"record1"}->{FIELD1} = 1;
Klassy v Perl predstavlyayut soboj pakety, a ob容kty -- nechto (obychno vse
ta zhe ssylka na anonimnyj hesh), privedennoe s pomoshch'yu funkcii bless k
klassu.
Vnutri paketa obychno sushchestvuet funkciya-konstruktor, kotoraya vypolnyaet
vsyu etu rabotu. Tipichnyj konstruktor vyglyadit kak
sub new
{
my $class = shift; # poluchaem imya klassa
my $self = {}; # vydelyaem novyj hesh dlya ob容kta
bless($self, $class); # privodim hesh k klassu
$self->{FIELD1} = "value1";# inicializiruem polya ob容kta
$self->{FIELD2} = "value2";
return $self;
}
Esli dannyj konstruktor opisan v pakete Class, to ispol'zovat' ego
mozhno kak
use Class;
$object1 = Class::new("Class");
$object2 = Class->new();
$object3 = new Class;
Vse tri zapisi ekvivalentny.
V dal'nejshem pri vyzove funkcij, opisannyh v pakete Class, cherez
ob容kty, vozvrashchennye konstruktorom, v pervom parametre im budet
peredavat'sya ssylka na dannye ekzemplyara:
sub f
{
my $self = shift;
$self->{FIELD1} = shift;
}
Fakticheski, Perl-programmistu prihoditsya vruchnuyu delat' vse to, chto S++
ot nego skryvaet za izyashchnym sintaksisom.
Osnovnye biblioteki, ispol'zuemye v web-programmirovanii
Odni i te zhe zadachi web-programmirovaniya mogut reshat'sya na Perl
razlichnymi sposobami, vybor podhodyashchego dlya konkretnogo prilozheniya -- v
znachitel'noj stepeni delo vkusa. Glavnyj lozung Perl -- "Vsegda est' bol'she
odnogo resheniya" (There's more than one way to do it, TMTOWTDI). V prilozhenii
k materialu tekushchego razdela, odnu i tu zhe rabotu vy mozhete sdelat'
samostoyatel'no, vruchnuyu razbiraya stroki ili otsylaya pakety, a mozhete
doverit' ee standartnym bibliotekam, kotorye, vprochem, tozhe mozhno
ispol'zovat' po-raznomu. Professional'naya cherta programmistov -- len' -- kak
pravilo, tolkaet nas po vtoromu puti, no dobrosovestnost' i lyubopytstvo
prinuzhdayut posmotret', kak zhe eto vse ustroeno vnutri.
Dlya nachala rassmotrim zadachu sozdaniya servernogo prilozheniya. Kak bylo
opisano vyshe, informaciya iz formy sobiraetsya v stroku vida
param1=value1¶m2=value2...¶mN=valueN, kotoraya popadaet v servernoe
prilozhenie libo cherez peremennuyu okruzheniya QUERY_STRING, libo cherez
standartnyj vvod, v poslednem sluchae peremennaya okruzheniya CONTENT_LENGTH
soderzhit ee razmer. Metod, kotorym peredavalis' dannyj, zadaetsya peremennoj
okruzheniya REQUEST_METHOD.
Dostup k peremennym okruzheniya v Perl osushchestvlyaetsya cherez associativnyj
massiv %ENV, dlya chteniya stroki zadannogo razmera iz vhodnogo potoka
predpochtitel'nej vospol'zovat'sya funkciej read. Vsya procedura polucheniya
vhodnoj stroki vyglyadit tak (v real'noj programme stoilo by dobavit'
ogranichenie na dlinu vhodnoj stroki):
if($ENV{"REQUEST_METHOD"} eq 'POST')
{
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
}
else
{
$query = $ENV{'QUERY_STRING'};
}
Dalee nam ponadobitsya razbit' vhodnuyu stroku na sostavlyayushchie:
@params = split(/&/, $query);
Teper' @params soderzhit spisok stroki vida param1=value1. Dalee nam
pridetsya vydelit' iz nih imena i znacheniya, ne zabyvaya o neobhodimosti
dekodirovaniya nestandartnyh simvolov:
foreach $p(@params)
{
($name, $value) = split(/=/, $);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$in{$name} = $value;
}
Vpervye vstretivshayasya nam funkciya hex zanimaetsya preobrazovaniem
"shestnadcaterichnaya stroka->chislo", funkciya pack -- preobrazuet poluchennoe
znachenie v binarnuyu formu, osushchestvlyaya v nashem sluchae preobrazovanie "kod
simvola->simvol".
Po zavershenii cikla vse parametry formy okazyvayutsya razmeshchennymi v
associativnom massive %in, i ih znacheniya mozhno poluchit' kak $in{'param1'}.
Dalee sleduet soderzhatel'naya chast' nashej programmy, obrabotka vhodnyh
parametrov, vyborka dannyh iz baz i t.p. Nakonec, obrabotannuyu informaciyu
neobhodimo vernut' pol'zovatelyu. V pervuyu ochered' neobhodimo soobshchit'
klientu, kak imenno on dolzhen rassmatrivat' peredavaemuyu dalee informaciyu.
Kak my pomnim, eto osushchestvlyaetsya s pomoshch'yu HTTP-zagolovkov.
Kak pravilo, ispol'zuetsya dva sposoba -- perenapravlenie klienta na
novyj adres, ili formirovanie virtual'nogo dokumenta. V pervom sluchae vse,
chto ot nas trebuetsya -- vyvesti na standartnyj vyvod zagolovok Location:
print "Location: <u>http://newurl/text.html\n\n"</u>;
Vo vtorom sluchae my soobshchaem klientu, chto vsya posleduyushchaya informaciya
dolzhna rassmatrivat'sya, k primeru, kak html-fajl:
print "Content-type: text/html\n\n";
print '<html><head><title>Ok</title></head><body>Results:
<br>...</body></html>';
CHerez HTTP-zagolovki peredaetsya massa vspomogatel'noj informacii --
versiya servera, informaciya o kliente, cookie, sposob avtorizacii i t.p.
Kak vidite, nichego slozhnogo v poluchenii i peredache informacii
CGI-prilozheniem net, no dejstviya pri etom vypolnyayutsya tipovye, i voznikaet
estestvennoe zhelanie napisat' ih raz i navsegda i pomestit' v biblioteku. My
ne pervye, u kogo vozniklo takoe zhelanie, tak chto teper' vmesto perenosa iz
skripta v skript tipovogo koda mozhno vospol'zovat'sya standartnym (nachinaya s
versii Perl 5.004) modulem CGI.pm:
use CGI;
$Query = new CGI;
$val1 = $Query->param('param1'); # poluchaem znachenie parametra
$cookie1 = $Query->cookie('cookie1'); # poluchaem znachenie cookie
# Podgotavlivaem novyj cookie:
$newcookie = $Query->cookie(
-name=>'new', # imya
-value=>'value', # znachenie
-expires=>"+1y", # prekrashchaet dejstvie cherez god
-domain=>'www.mydomain.ru' # opredelen dlya nekotorogo domena
);
Formiruem i vyvodim HTTP-zagolovki:
print $Query->header(
-type=>'text/html',
-cookie=>$newcookie,
-Pragma=>"no-cache"
# ...
);
Takzhe CGI.pm soderzhit funkcii dlya formirovaniya html-koda, sohraneniya
rezul'tatov zaprosa v fajle i t.p. Dopolnitel'nuyu informaciyu o module mozhno
poluchit' s pomoshch'yu komandy perldoc CGI.
Napisanie klientskih web-prilozhenij na Perl stroitsya po obratnoj sheme
-- formiruem stroku parametrov i HTTP-zagolovki, soedinyaemsya s serverom,
peredaem emu zapros i ozhidaem otvet. Kak obychno, prodelat' eto mozhno
neskol'kimi sposobami.
1. Recept dlya lyubitelej ruchnoj raboty. Ispol'zuem nizkourovnevye
funkcii dlya raboty s soketami, yavlyayushchiesya minimal'nymi obertkami vokrug
sootvetstvuyushchih funkcij na S.
use Socket;
# podgotavlivaem strochku s parametrami formy
$forminfo = 'param1=val1¶m2=val2';
# podgotavlivaem i osushchestvlyaem soedinenie:
# vybiraem rabotu cherez TCP
$proto = getprotobyname('tcp');
# otkryvaem potokovyj soket
socket(Socket_Handle, PF_INET, SOCK_STREAM, $proto);
# podgotavlivaem informaciyu o servere
$port = 80;
$host = "www.somehost.com";
$sin = sockaddr_in($port,inet_aton($host));
# soedinyaemsya s serverom
connect(Socket_Handle,$sin) || die ("Cannot connect");
# peredaem serveru komandy, ispol'zuya deskriptor soketa
# sobstvenno komanda GET
send Socket_Handle,"GET /cgi-bin/env.cgi?$forminfo HTTP/1.0\n",0;
# HTTP-zagolovki
send Socket_Handle,"User-Agent: my agent\n",0;
send Socket_Handle,"SomeHeader: my header\n",0;
send Socket_Handle,"\n",0;
# nachinaem chtenie iz deskriptora soketa analogichno
# tomu, kak chitali iz fajla.
while (<Socket_Handle>)
{
print $_;
}
close (Socket_Handle);
Pri ispol'zovanii nestandartnyh simvolov v parametrah formy ih sleduet
preobrazovat' v vid %XX, gde XX -- ih shestnadcaterichnoe predstavlenie.
Kodirovanie vypolnyaetsya sleduyushchim kodom:
$value=~s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/eg;
2. CHut' men'she ruchnoj raboty -- ispol'zovanie modulya IO::Socket.
Rassmotrim ego na primere metoda POST:
use IO::Socket;
$forminfo = 'param1=val1¶m2=val2';
$host = "www.somehost.com";
$socket = IO::Socket::INET->new(Proto => "tcp",
PeerAddr => $host,
PeerPort => "http(80)")
or die ("Cannot connect");
$socket->autoflush(1);
$length = length($forminfo)+1;
$submit = "POST $path HTTP/1.1\n".
"Content-type: application/x-www-form-urlencoded\n".
"Content-length: $length\n".
"Host: $host\n\n"
"$forminfo\n";
print $socket $submit;
while(<$socket>)
{
print;
}
close $remote;
3. Nakonec, naibolee komfortnyj dlya programmista variant --
ispol'zovanie kompleksa modulej libwww-perl, ili LWP. LWP, kak pravilo,
vhodit vo vse poslednie distributivy Perl, krome togo, poslednyaya versiya
vsegda dostupna na CPAN i na <u>http://www.linpro.no/lwp/.</u>
Osnovnye moduli, ispol'zuemye pri rabote s LWP (dlya polucheniya
dopolnitel'noj infomracii o kazhdom module vospol'zujtes' komandoj perldoc
<imya modulya>):
LWP::UserAgent
LWP::Simple
HTTP::Request
HTTP::Response
HTTP::Headers
HTTP::Cookies
LWP::Simple prednaznachen dlya prostejshih operacij napodobie polucheniya
informacii o dokumente ili poluchenii dokumenta metodom GET:
use LWP::Simple;
$content = get('http://somehost/text.html');
LWP::UserAgent -- osnovnoj modul' dlya bolee tonkoj raboty s web. Ego
naznachenie -- sozdanie virtual'nogo brouzera, vypolnyayushchego vsyu rabotu po
vzaimodejstviyu s serverom:
# sozdanie
$UserAgent = new LWP::UserAgent;
# zadanie stroki s imenem "brouzera"
$UserAgent->agent("MoZilla 9.0 (non-compatible; MSIE 9.3; PalmOS)");
# rabota cherez proksi
$UserAgent->proxy('http', $proxy);
HTTP::Request otvechaet za formirovanie zaprosa serveru, HTTP::Headers
-- za formirovanie zagolovkov zaprosa:
# formiruem zagolovki
$Headers = new HTTP::Headers(Referer => $referer);
# formiruem zapros
$Request = new HTTP::Request(POST => $url, $Headers);
# govorim, chto peredavat'sya budut dannye formy
$Request->content_type('application/x-www-form-urlencoded');
# peredaem dannye
$Request ->content($forminfo);
Vzaimodejstvie s serverom osushchestvlyaetsya funkciej request, vozvrashchayushchej
ob容kt HTTP::Response:
$Response = $UserAgent->request($Request);
if($Response->is_success) # uspeshno vypolnennyj zapros
{
# poluchaem informaciyu, vozvrashchennuyu serverom
$text = $Response->content;
}
Dlya raboty s cookie ispol'zuetsya modul' HTTP::Cookie i funkciya
cookie_jar, soobshchayushchaya nashemu virtual'nomu brouzeru o neobhodimosti
ispol'zovat' ob容kt Cookie:
my $SookieJar = new HTTP::Cookies;
$UserAgent->cookie_jar($CookieJar);
Dlya sohraneniya i zagruzki cookie ispol'zuyutsya funkcii
$CookieJar->load($cookiefilename);
$CookieJar->save($cookiefilename);
Mozhno formirovat' ih znacheniya i vruchnuyu s pomoshch'yu funkcii set_cookie.
Dlya dostupa k resursam, zashchishchennym sredstvami servera, ispol'zuetsya
HTTP-zagolovok Authorization. Ego znachenie dolzhno soderzhat' tip avtorizacii
(obychno BASIC) i stroku vida "imya_pol'zovatelya:parol'", v sluchae
basic-avtorizacii zakodirovannuyu base64. Dlya kodirovaniya mozhno
vospol'zovat'sya modulem MIME::Base64:
use MIME::Base64;
$authorization = MIME::Base64::encode_base64("$name:$password");
$Request->header(Authorization => "BASIC $authorization");
Rabota s bazami dannyh
Dlya raboty s bazami dannyh v Perl ispol'zuetsya standartnyj interfejs
programmirovaniya DBI, obespechivayushchij dostup k bol'shinstvu sushchestvuyushchih SUBD
s pomoshch'yu podklyuchaemyh drajverov. Shemy podklyucheniya k razlichnym SUBD
(tochnee, pravila formirovaniya imeni istochnika dannyh) mogut neznachitel'no
razlichat'sya, my rassmotrim rabotu s ispol'zovaniem mySQL.
V pervuyu ochered' neobhodimo podklyuchit' modul' DBI:
use DBI;
Dalee podklyuchaemsya k baze dannyh:
my $dbh = DBI->connect('DBI:mysql:hostname:base:port', 'user,
'password, { RaiseError => 1, AutoCommit => 1});
Zdes' $dbh -- deskriptor bazy dannyh, ispol'zuemyj v dal'nejshej rabote,
DBI:mysql:hostname:base:port -- imya istochnika dannyh, vklyuchayushchee imya
drajvera, imya hosta, bazy, k kotoroj my podklyuchaemsya, i nomer porta, na
kotoryj nastroen sql-server, user/password -- imya i parol' pol'zovatelya,
imeyushchego dostup k baze, v poslednem parametre peredayutsya razlichnye flagi.
Po zavershenii raboty zhelatel'no zakryt' deskriptor:
$dbh->disconnect();
Vozmozhno ispol'zovanie dvuh sposobov raboty s bazoj. V sluchae, esli nam
nuzhno tol'ko peredat' informaciyu v bazu, ispol'zuetsya metod do, parametrom
kotorogo yavlyaetsya stroka SQL-zaprosa:
$dbh->do("insert into mytable values (1,1)");
Esli zhe neobhodimo poluchit' informaciyu iz bazy, ispol'zuetsya sleduyushchaya
procedura:
1. Poluchaem deskriptor komandy s pomoshch'yu metoda prepare:
my $sth = $dbh->prepare ("select * from mytable where field1>1");
2. Vypolnyaem komandu:
$sth->execute();
3. Poluchaem dannye. Ispol'zuetsya odin iz chetyreh metodov:
fetchrow_array
fetchrow_hash
fetchrow_arrayref
fetchrow_hashref
Metody vozvrashchayut sootvetstvenno massiv, hesh, ssylku na massiv, ssylku
na hesh, v kotoryh hranyatsya znacheniya polej tekushchej zapisi. Dlya vyborki vseh
zapisej ispol'zuetsya cikl, posle vyborki vseh zapisej funkcii vozvrashchayut
pustoj spisok, vosprinimaemyj kak znachenie false:
while(my $hash_ref = $sth->fetchrow_hashref)
{
foreach my $fieldname(keys %$hash_ref)
{
print "$fieldname: $hash_ref->{$fieldname }\n";
}
print "\n";
}
4. Osvobozhdaem resursy:
$sth->finish();
Pri peredache tekstovoj informacii v bazu rekomenduetsya predvaritel'no
obrabotat' ee metodom $dbh->quote(), rasstavlyayushchim kavychki i upravlyayushchie
simvoly v stroke v sootvetstvii s pravilami ispol'zuemoj SUBD.
Krome togo, vozmozhno ispol'zovanie privyazki parametrov v vide:
$sth = $dbh->prepare("select * from mytable where field1=?");
$sth->bind_param(1, "znachenie parametra");
$sth->execute();
libo
$sth = $dbh->prepare("select * from mytable where field1=?");
$sth->execute("znachenie parametra");
V etom sluchae v metode quote neobhodimosti net, on vyzyvaetsya
avtomaticheski.
Ispol'zovanie privyazki parametrov osobenno effektivno pri vypolnenii
neskol'kih odnotipnyh zaprosov podryad. V etom sluchae dostatochno odin raz
podgotovit' zapros s pomoshch'yu funkcii prepare, i vypolnyat' ego s pomoshch'yu
funkcii execute stol'ko raz, skol'ko neobhodimo.
Zadaniya dlya laboratornyh rabot
1. Prostejshaya kartoteka
Cel' raboty.
Osvoenie bazovyh vozmozhnostej yazyka Perl, raboty so strukturami dannyh,
fajlovym vvodom-vyvodom.
Postanovka zadachi.
Realizovat' na Perl konsol'noe prilozhenie, pozvolyayushchee dobavlyat',
redaktirovat', vyvodit' na ekran, sohranyat' v fajl spisok odnotipnyh
ob容ktov (studentov gruppy, sluzhashchih firmy, zhitelej doma i t.p.), kazhdyj iz
kotoryh obladaet neskol'kimi atributami (imya, familiya, vozrast i t.p.).
Trebovaniya k realizacii.
ispol'zovat' direktivu use strict;
vzaimodejstvie s pol'zovatelem osushchestvlyaetsya cherez prostoe tekstovoe
menyu, vybor dejstviya -- vvod cifry;
menyu vklyuchaet v sebya sleduyushchie punkty: dobavit', redaktirovat', udalit'
ob容kt, vyvesti na ekran ves' spisok, sohranit' v fajl, zagruzit' iz fajla;
celesoobrazno realizovat' obrabotku menyu s pomoshch'yu hesha ssylok na
funkcii;
dannye sohranyayutsya v dbm-fajl;
pri zagruzke v pamyat' kazhdyj ob容kt hranitsya v vide ssylki na anonimnyj
hesh, vsya kartoteka hranitsya v vide massiva (libo hesha) ssylok.
2. Kartoteka s web-interfejsom
Cel' raboty.
Osvoenie sposobov postroeniya CGI-prilozhenij na Perl.
Postanovka zadachi.
Preobrazovat' konsol'noe prilozhenie kartoteki v CGI-prilozhenie,
rabotayushchee sovmestno s web-serverom.
Trebovaniya k realizacii.
dlya polucheniya informacii ot klienta ispol'zovat' standartnuyu biblioteku
CGI.pm;
sohranit' funkcii raboty s fajlami i shemu obrabotki menyu,
realizovannye v pervoj laboratornoj rabote, pri vyvode tekstovoj informacii
osushchestvlyat' preobrazovanie kodirovki cp866->win1251.
3. Kartoteka s web-interfejsom, ispol'zuyushchaya mySQL
Cel' raboty.
Osvoenie sposobov vzaimodejstviya Perl-prilozhenij s bazami dannyh.
Postanovka zadachi.
Preobrazovat' CGI-prilozhenie kartoteki, osnovannoe na rabote s
dbm-fajlami, v klienta bazy dannyh mySQL.
Trebovaniya k realizacii.
predusmotret' vozmozhnost' konvertirovaniya informacii, hranyashchejsya v
dbm-fajlah, v format mySQL;
ispol'zovat' mehanizm privyazki parametrov;
dobavit' ob容kt, obladayushchij rasshirennymi atributami (upravlyayushchij,
starosta i t.p.).
4. Klientskoe prilozhenie kartoteki
Cel' raboty.
Osvoenie tehniki postroeniya klientskih prilozhenij, ispol'zuyushchih
protokol http.
Postanovka zadachi.
Realizovat' na Perl konsol'noe klientskoe prilozhenie k kartoteke,
schityvayushchee iz dbm-fajla informaciyu ob ob容ktah, i peredayushchee ee
CGI-prilozheniyu iz tret'ej laboratornoj raboty po protokolu http dlya
zaneseniya v bazu.
Trebovaniya k realizacii.
ispol'zovat' biblioteku LWP;
pri peredache strokovoj informacii kodirovat' nestandartnye simvoly v
format %XX, gde XX -- shestnadcaterichnoe predstavlenie dannogo simvola, a
takzhe osushchestvlyat' preobrazovanie kodirovki cp866->win1251.
Rekomenduemaya literatura
Dekart A., Bans T. Programmirovanie na Perl DBI/Per. s angl. -- SPb:
Simvol-Plyus, 2000. -- 400 s.
Kristiansen T., Torkington N. Perl. Biblioteka programmista/Per s angl.
-- SPb.: "Piter", 2000. -- 736 s.
Najk D. Standarty i protokoly Interneta/Per. s angl. -- M.:
Izdatel'skij otdel "Russkaya redakciya" TOO "Channel Trading Ltd.", 1999, --
384 s.
Spejnaur S., Kuersia V. Spravochnik Web-mastera/Per. s angl. -- K.:
Izdatel'skaya gruppa BHV, 1997. -- 368 s.
SHvarc R., Kristiansen T. Izuchaem Perl/Per. s angl. -- K.: Izdatel'skaya
gruppa BHV, 1998. -- 320 s.
Last-modified: Sun, 09 Sep 2001 17:58:10 GMT