Ocenite etot tekst:


---------------------------------------------------------------
     © Copyright Dmitrij Leonov
     Email: web@hackzone.ru
     WWW: http://www.hackzone.ru
     Date: 09 Sep 2001
---------------------------------------------------------------





     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.



     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">.



     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).




     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&param2=value2...&paramN=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&param2=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.



     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).



     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.



     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&param2=value2...&paramN=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&param2=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&param2=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.






     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.




     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.



     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.).



     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.





     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
Ocenite etot tekst: