Documente Academic
Documente Profesional
Documente Cultură
2)
next
3) aleg yes
1
6)
5) next
Finish
si try
2
7)
pentru scripturi windows aleg ca mai sus si open
8)salvarea fisierelor se face astfel:numefisier.pl
PROG
9)executarea se face din meniul PERL ALEG RUN PERL INTERPRETER
RAM
ARE
PERL
ASPE
CTE
TEOR
ETIC
E
3
Tipuri de date
•Variabilã =zonã (de obicei contiguã)de memorie în care se stocheazã o valoare de un anumit tip, zonei
fiindu-I asociat un nume (identificator al acelei variabile) Scalar
•Aceastã zonã poate fi publicã sau privatã,permanentã sau temporarã pe arcursul e
executiei unui program (simpl
•Numele unei variabile trebuie sã înceapã e)–
cu o literã si poate contine caracterele alfa-numerice si "_". Pentru
• Clasificare gener
–Tipuri scalare (simple) area
•Intregi (cu semn sau nu) unor
•Numere flotante caract
•Siruri de caractere ere
–Tipuri complexe special
•Tablouri indexate e(e.g.,
•Tablouri associative NewLi
• Scalare (simple) ne,
– Intregi cu semn, numere flotante, TAB,
siruri de caractere …) se
– Variabilele de tip scalar au numele precedat de $ vor
– Nu trebuie declarate explicit inainte de a fi utilizate utilize
– Implicit, o variabila numerica are valoarea 0, caract
iar una caracter are valoarea sirul vid "" erele
$nr_studenti++; escap
$pi = 3.14152965; e (ca
$limbaj = "Perl"; in
• Scalare (simple) cazul
– Variabilele de tip sir de caractere au valori incadrate limbaj
intre ghilimele sau apostrofuri ului C)
$prenume = "Hermann"; •
$nume = 'Hesse'; \
# variabilele vor fi expandate n≡Ne
$scriitor = "$prenume $nume"; wLine
# variabilele nu vor fi expandate •
$scriitor2 = '$prenume $nume';
4
\t≡TAB •
• Cheile
\" ≡"$ sau
$salut ="Buna ziua!\nSalut iar!\n"; valoril
e nu
Complexe sunt
– Tablouri indexate ordon
• Liste ordonate de valori scalare (numere, siruri) ate
• Elementele listei sunt disponibile prin intermediul •
unui indice numeric Variab
• Numele unor variabile de tip tablou indexat incepe cu @ ilele
@limbaje = ("Lisp", "C", "Java", "Perl"); de tip
@mix = ("Pink", 1978, "Floyd", $pi); tablou
$primul_limbaj = $limbaje[0]; asocia
@primele_3 = @limbaje[0..2]; # sub-tablou tiv
• Un tablou poate contine elemente eterogene, sunt
de tipuri scalare diferite prefix
• Pentru a adauga si sterge elemente la sfirsitul unui tablou ate de
se vor folosi functiile push() si pop() %
push (@limbaje, "Prolog"); %cure
$eliminat = pop (@limbaje); nte =
• Aflarea lungimii unui tablou ("reali
$nr_limbaje = @limbaje; sm"
$nr_limbaje = scalar (@limbaje); => 4,
• Pot fi utilizate si in partea stinga a unei atribuiri "expre
($primul, $al_doilea) = @limbaje; sionis
($primul, @restul) = @limbaje; m" =>
($studenti, $profesori) = ($absenti, 3); 10,
• Elementele se pot ordona cu functia sort() "mode
• Inversarea unei liste de elemente rnism
se poate face cu reverse() " =>
33);
– Tablouri asociative
• Indicele numeric este substituit de un sir de caractere
• Liste de perechi (cheie, valoare)
5
$romane_moderne = $curente{"modernism"}; $0-
• Intre acolade vor fi precizate doar nume de chei, numel
nu valori ale cheilor e
• Cheile nu pot fi accesate speficind valorile lor progra
intre acolade mului
• O cheie trebuie sa fie unica, care
dar valorile cheilor pot fi duplicate se
• Lista cheilor este furnizata de functia keys() execut
• Lista valorilor este data de functia values() a
• Functia each() furnizeaza o pereche (cheie, valoare) •
@lista_curentelor = keys %curente; $_ -
($curent, $romane) = each (%curente); intrare
• Inserarea unui element intr-un tablou asociativ se face printr-o constructie de genul: a
# 10 romane baroce implici
$curente{"baroc"} = 10; tã sau
spatiul
• Exemplu de parcurgere a unui tablou asociativ de
while (($curent, $romane) = each (%curente)) { cautar
print "Din curentul $curent sunt disponibile e intr-
$romane romane.\n"; un sir
}
•
• Sortarea cheilor – functia sort()
# Lista sortata a curentelor
@curente = sort (keys (%curente));
• De test – unless –
– Complementara lui if unless ($nr_studenti >= 30) { print ("Cam putini studenti!\n"); } else { print
("Multi studenti la curs:)\n"); } A
8
{
tit if cit si unless pot fi scrise in forma postfixata print "E chiar el" if $nume eq "Hesse" or $nume eq
"Hermann"; print
$nr_studenti-- unless $nr_studenti; "$nota
\n"
• De control unless
– while $nota !
• Evalueaza o expresie si daca valoarea evaluata este adevarata se va executa blocul de instructiuni, dupa = 10;
care se va reevalua expresia si daca valoarea evaluata este adevarata se va executa blocul de instructiuni, }
dupa care se va reevalua expresia si daca… (aproape ad infinitum) print
$studenti = 1; "Gata\
while ($studenti <= 10) { n";
print ("$studenti pe pinza de paianjen...\n"); foreac
$studenti++; h
} $curen
print "Gata!\n"; t (sort
(keys
(%cur
• De control– do ente)))
• Complementara lui while, evaluarea expresiei realizindu-se dupa executia macar o singura data a blocului {
de instructiuni print
do { "$cure
$studenti++; nt are
print "Suntem $studenti\n"; $curen
} until $studenti > 10; te{$cu
– for rent}
• Utilizata de obicei ca instructiune iterativa roman
for ($stud = 1; $stud <= 10; $stud++) { e\n";
print "$stud pe pinza...\n"; •
}
–foreach
•
Utilizata de obicei pentru iterarea tablourilor
@note =(9, 9, 7, 10, 5, 8, 8);
foreach $nota (@note )
9
Variabila de ciclu este o referinþã a listei,nu o copie a acesteia ( elementele listei se pot altera!)
– next
• Permite saltul la finalul blocului de instructiuni si
inceperea urmatoarei iteratii la un while, do, for,
foreach (similar cu continue din C/Java)
for ($grupa = 1 ; $grupa <= 4 ; $grupa++){ next if $grupa == 2; print "Grupa: }
– last
• Va finaliza ciclul de instructiuni si va continua
cu urmatoarea instructiune dupa blocul de
instructiuni al unui while, do, for sau foreach
foreach $grupa (1 .. 4) { if ($grupa == 2) { last }; print "Grupa: $grupa\n"; }print "Gata!\n";
Functii si proceduri
• Grup de instructiuni care poate fi definit de utilizator oriunde in program,cu scopul de a reutiliza
codul-sursa
• Tipuri:
- Proceduri - nu returneaza nimic
- Functii - returneaza o anumita valoare
• Declaratia:
sub nume ( parametri ) {
bloc # grup de instructiuni
• Lista de parametri poate lipsi
sub aduna {
# lista argum. e disponibila in variabila @.
$primul = shift;
$al_doilea = shift;
return $primul + $al_doilea;# se apeleaza subrutina (functia) "aduna print &aduna (2,
7);
10
Pentru returnarea valorilor se pot folosi variabilele $_ sau @_
Subrutinele se pot apela recursiv
Se pune la dispozitie
o paleta larga de subrutine predefinite
Categorii de subrutine predefinite:
- Manipularea valorilor scalare: chomp, chop, chr,
crypt, hex, index, length, ord, reverse, sprintf,
substr, tr,...
- Expresii regulate: pos, split, study,...
- Functii numerice:
abs, cos, exp, int, log, oct, rand, sin, sqrt, srand,..
-Procesarea tablourilor: pop, push, shift, unshift,...
- Procesarea listelor: grep, join, map, sort, unpack,.
- Procesarea tablourilor asociative:
delete, each, exists, keys, values
Categorii de subrutine predefinite:
- Intrari/iesiri: close, closedir, die, eof, fileno, flock,
format, getc, print, printf, read, readdir, seek, tell,
truncate, warn, write,...
- Fisiere & directoare: chdir, chmod, chown, fnctl,
glob, ioctl, link, mkdir, open, opendir, rename,
rmdir, stat, unlink,...
-Controlul fluxului programului: continue, die, do, eval, exit, goto, last, next, redo, return, sub,...
-Controlul vizibilitatii: import, local, my, use,...
- Procese: alarm, exec, fork, kill, pipe, sleep, wait,...
Categorii de subrutine predefinite:
-Acces la retea (socket-w\)\ accept, bind, connect, listen, recv, send, shutdown, socket,...
- Informatii despre retea:
gethostbyaddr, gethostbyname, gethostent,
getnetbyaddr, getnetbyname,...
- Manipularea timpului:
gmtime, localtime, time,...
- Alte functii utile:
defined, dump, scalar, undef,...
Nota: majoritatea subrutinelor predefinitesunt considerate drept operator! Unari (nu trebuie utilizate obligatoriu parantezele)
print (sin (3.14)); print sin 3.14;
Fisiere
11
Fisier: colectie logic contigua de date, stocata pe un mediu (fizic) de memorare Implicit, se pot utiliza:
- STDIN - intrarea standard (tastatura)
- STDOUT - iesirea standard (ecranul)
- STDERR - iesirea de eroare standard (ecranul)
Citirea datelor se realizeaza cu operatorul < >
Scrierea datelor se poate realize cu functiile obisnuite de afisare (print, printf)
• Exemplu
print STDOUT "Un nume, va rugam: ";
$nume = <STDIN>;
print STDOUT "Salut, $nume";
• In variabila $nume vor fi stocate caracterele
preluate de a intrarea standard,
inclusiv newline care marcheaza finalul introducerii sirului de la terminal
• Pentru eliminarea caracterului newline
se folosesc chopQ sau chompQ
Inainte de a fi utilizat, un fisier trebuie deschis;
open (FIL, "nume_fisier");
Citirea din fisier se va realiza cu operatorul <> Scrierea in fisier se va face cu print/printf La finalul prelucrarii, fisierul trebuie
inchis:
close (FIL);
Toate functiile uzuale din limbajul C destinate manipularii fisierelor sunt suportate: seekQ, tellQ, renameQ, chmodQ, chownQ, IstatQ, linkQ,
symlinkQ, unlinkQ, ioctlQ,... Pentru directoare, se pot utiliza: opendirQ, readdirQ si closedirQ Expandarea continutului unui fisier se
realizeaza cu <> sau globQ
Qpagini = <*.html>; ©director = glob("/tmp/*");
Modul: unitate de cod precompilat,incapsuland diferite functionalitati oferite programatori lorSe stocheaza in fisiere cu extensia
.pm,codul putand fi utilizat ulterior,fara "reinventarea rotii"
Modulele se includ in program prin use Modul;
In mod uzual, fiecare modul are propria lui
documentatie, disponibila prin man sau perldoc Se pun la dispozitie unele module standard (disponibile in orice distributie Perl
actuala):
CGI - pentru scrierea de scripturi CGI
(Common Gateway Interface)
File - pentru prelucrarea facila
a fisierelor/directoarelor
- Math - pentru operatiuni matematice
(e.g., calcule cu numere complexe)
12
- Socket - pentru programarea in retea (Internet)
Modul: unitate de cod precompilat,
incapsuland diferite functionalitati
oferite programatori lor
Se stocheaza in fisiere cu extensia .pm,
codul putand fi utilizat ulterior,
fara "reinventarea rotii"
Modulele se includ in program prin use Modul;
In mod uzual, fiecare modul are propria lui
documentatie, disponibila prin man sau perldoc
Se pun la dispozitie unele module standard (disponibile in orice distributie Perl actuala):
- CGI - pentru scrierea de scripturi CGI
(Common Gateway Interface)
- File - pentru fisiere/director
- Math - pentru matematica
Socket - pentru programarea in retea (Internet)
Unele module se pot baza pe altele, onstituind ierarhii
Exemple:
- File::Find - traversarea unui arbore de directoare
- HTML::Parser - prelucrarea documentelor HTML
- Math::Complex - lucrul cu numere complexe
- Search:Diet - cautarea unei chei dintr-un dictionar
-XML::Parser - utilizarea analizorului XML prin SAX
- XML: :XSLT - transformari XSL
Expresii regulate
Expresie regulata (regular expression) = gabion (pattern) caruia, pe baza unor reguli precise, i se poate asocia unui text
Variabila implicita in care se realizeaza diferite act;iuni implicand expresii regulate este $_
Specificarea altei variabile se realizeaza prin intermediul operatorului =~
Se poate utiliza si operatorul !~ (echivalent cu negatia lui =~)
Operatorul m//
- Se foloseste pentru a cauta un sablon in cadrul unui text dat (daca nu e pericol de confuzie,litera "m" poate lipsi)
- Se returneaza valoarea logica "adevarat" in cazul in care cautarea se incheie cu succes,
"fals"inrest
while (<STDIN>) {
print "Am gasit subsirul \"Victor\" in $_" if m/Vika/;
Operatorul qr//
- Precompileaza un sir de caractere ca expresie regulata
- Expresia regulata precompilata poate fi stocata intr-o variabila sj refolosita in constructia altor expresii regulate sau poate fi utilizata direct
my $expr = qr/(autmat|automt)/i;
Delimitarea expresiei regulate si, daca este cazul, a s.irului substituitor se poate realiza cu alte caractere speciale decat"/"
while (<>) { print if m | <pre> | i.. m | </pre> | i;
Identificarea caracterelor
-Cautarea unui caracter se face specificindacel caracter -Pentru cautari complexe, se folosesc meta-caractere = caractere care nu se identified pe
ele Tnsele in cadrul unei expresii regulate
Meta-caracterul.
-Utilizat sa identifice orice caracter, exceptand caracterul newline "\n"
Meta-caracterele [...]
-Reprezinta o clasa de caractere (enumerare): /[a-z]/ /[a-z][ATX][0-7]/
Meta-caracterul ^
-Folosit in cadrul unei secvente de caractere are rol de negare
[^2-5] - toate caracterele exceptind 2, 3, 4, 5
-In alte cazuri, desemneaza inceputul unei linii
14
^[2-5] - orice sirincepind cu o cifra cuprinsa intre [255..1]
Meta-caracterul $
-Identifica finalul unei linii: /Hesse$/
Meta-caracterul |
-Alternativa intre doua sau mai multe forme posibile ale unei secvente dintr-un text while (<STDIN>) { p r i n t i f ( / [ 0 - 9 ] | [ A - Z ] [ a - z ] / ) ;
Meta-caracterele ()
-Grupeaza atomi si memoreaza valoarea subsirurilor din text corespunzatoare acestor atomi
-Atom = caracter lipsit de semnificatie ori un meta-caracter de pozitionare (A sau $)
Meta-caracterele ? * + { }
-Au rolul de multiplicatori r ai unui atom -Un atom urmat de ? poate identifica de
zero sau maxim o singura data un atom -Simbolul * poate identifica zero, una
sau mai multe aparp consecutive
ale aceluiasj atom -Un atom urmat de + poate sa identifice
macar o aparitjie a atomului
• Meta-caracterele ? * + { }
while (<STDIN>) {
print "Cel putin o aparitie a cuvintului \'web\' la inceputul liniei\n"
Meta-caracterele ? * + { }
- atom {m, n} va identifica Tntr-o expresie eel put;in
777 atomi, dar nu mai mul£i de n
- atom {m,} va identifica m sau mai mult;i atomi
- atom {,/?} va identifica n atomi eel mult
- atom {n} va identifica exact n atomi
Constructii predefinite
-\d o cifra: [0-9]
-\w un caracter a Ifa numeric: [0-9_a-zA-Z]
-\s un spatiu alb: [\t\r\n\ \f ]
-\D orice exceptind cifre: [A0-9]
-\W caracter ne-alfanumeric: [A0-9_a-zA-Z]
-\S orice exceptind spatii albe: [A\t\n\r\ \f]
Constructii predefinite
-\b identifica limitele unui cuvint
-\B identifica orice alt context decat limitele
unui cuvant (interiorul unui cuvant) -\A desemneaza inceputul unui sir -\Z identifica sfarsitul unui
sir
-Exemplu: /text\b/ poate identifica " text", "text", "context", dar nu si "textul"
Functia tr///
-Translateaza caracter cu caracter un text
# majusculele devin minuscule
tr/A-Z/a-z/
# http:
devine ftp:
tr/http:/ftp
:/
Functia splitQ
-Imparte un sir de caractere in functie de o expresie regulata si returneaza un tablou contjinand subsirurile
care nu satisfac acea expresie regulata
$data_sistem = localtime (time); ($ziua, $luna, $num, $timp, $an) =
split(/\s+/, $data_sistem);
Functia joinQ
-Reuneste mai multe s.iruri de caractere in unul singur, delimitate de un scalar
Functia evalQ
-Poate fi folosita pentru evaluarea/executiaunei expresii Perl -Valoarea returnata reprezinta valoarea ultimei
expresii evaluate
else { return 1 ; }
Variabile suplimentare:
HTTP_ACCEPT, HTTP_USER_AGENT,...
XML in Perl
Utilizarea procesorului Expat si a modelulul DOM pentru
manipularea documentelor XML in Perl
m n cadrul acestui articol vom urmari sa ilustram cateva dintre module. In afara modulelor din distribute Perl standard, exista o
facili-I taţile puse la dispoziţie de modulele Perl pentru prelucrarea colecţie globala a tu-turor materialelor publice referitoare la Perl,
facila a I documentelor XML, folosind SAX (Simple API for colecţie referita sub denu-mirea CPAN (Comprehensive Perl Archive
XML) si DOM (Document Object Model). Network). CPAN ofera un numa impresionant de module grupate
pe urmatoarele categorii:
Modulele Perl • extensii de limbaj si unelte de documentare;
Inainte de a discuta despre cum prelucram documentele XML, • suport pentru dezvoltare de programe/module;
este necesar sa prezentam pe scurt conceptele de pachet si de • interfere (la nivel scazut sau ridicat) cu sistemul de operare;
modul Perl. • comunicarea intre procese, in reţea si controlul dispozitivelor
Un pachet Perl poate fi considerat drept implementarea unei (e.g.
clase pe care o putem instanţia in cadrul unui script. Subrutinele modemuri);
incluse intr-un pachet pot juca, de asemenea, rolul de metode, • tipuri de date si conversii;
existand posi-bilitatea definirii de constructed si destructori. Mai • interfere cu bazele de date;
mult, se ofera su-port pentru derivarea unei metode aparţinand • interfere cu utilizatorul;
unui pachet, astfel incat pachetele Perl pot fi ierarhizate. Vom • interfere cu alte limbaje de programare;
referi variabilele din alte pachete prefixand identificatorul • procesarea fiserelor si sistemelor de fisiere;
variabilei respective cu numele pachetului urmat de „::", dupa • procesarea caracterelor;
cum se poate observa din urmatorul exemplu: • procesarea fisirelor de configurate si a parametrilor in linia de
comanda
$intrare = $main::STDIN; • suport pentru diverse limbi si alfabete (internaţionalizare);
• autentificare, securitate si criptare;
La fel, pentru metode: • suport pentru posta electronica si grupurile de stiri;
• suport pentru Web (HTML, HTTP, CGI, XML etc.);
$imagine = new GD::Image(174, 333); • utilitare pentru daemoni;
• suport pentru arhivarea si compresia datelor;
Daca nu este specificat numele pachetului, se considera implicit • procesarea informaţiilor grafice;
pa-chetul main. Astfel, construcţia $ :: v a r este echivalenta cu $ m a i • controlul fluxului (excepţii, erori etc.);
n: :var. Daca dorim sa accesam metode sau date-membru definite • procesarea fluxurilor de date si a fisierelor;
intr-un pachet derivat din altul vom specifica numele ambelor • altele.
pachete: Pentru un listing al tuturor locaţiilor Internet referitoare la
CPAN, consultaţi http://www.perl .com/perl /.
$Pachet::Subpachet::variabila Instalarea unui modul In unele cazuri va trebui sa luam un modul
de la CPAN pentru a-1 instala si folosi ulterior in cadrul
Un modul reprezinta un pachet public definit intr-un fisier . pm cu scripturilor noas-tre. Pentru a fi instalat pe un sistem
sco-pul de a fi reutilizat ulterior. Modulele Perl vor fi incluse in UNIX/Linux, un modul Perl se regaseste fie ca fisier tar arhivat cu
program, spre a fi folosite, prin construcţia: gzip (deci are extensia .tar.gz sau .tgz), fie ca fisier . pm (deja
dezarhivat). Orice modul Perl necesita pentru instalare existenţa
use Modul; interpretorului Perl in sistem. Dupa dezarhivare (cu tar -xzf
numearhiva.tgz), in directorul in care a fost stocat
Sunt puse la dispoziţie mai multe module standard (disponibile in
orice distribute Perl actuala), dintre care se pot menţiona: modulul dorit a fi instalat se dau urmatoarele comenzi (pentru
• Carp (pentru controlul erorilor si avertismentelor); a se putea executa ultima linie, utilizatorul trebuie sa aiba drepturi
• Config (pentru acces la opţiunile de configurare); de root):
• CGI (pentru generarea facila de scripturi CGI);
• Env (pentru accesarea variabilelor de mediu); perl Makefile.PL
• ExtUtils::Embed (pentru includerea de cod Perl in programele make
C); make test make
• File::Find (pentru traversarea recursiva a unui arbore de install
directoare);
• File::Handle (pentru manipularea fisierelor folosind In mod uzual, fiecare modul este acompaniat si de documentatia
descriptori de necesara exploatarii lui. Pentru a avea acces la ea, se foloseste
fisier); utilitarul perl doc:
• File::Path (pentru operaţii cu directoare);
• Math::Complex (pentru prelucrarea numerelor complexe); (infoiasi)$ perldoc XML::Parser
• POSIX (pentru asigurarea interfeţei cu standardul POSIX
IEEE Pentru convertirea documentatiei in format text sau HTML se
1003.1); pot uti-liza comenzile pos2text si, respectiv, pod2html, ca in
• Search::Dict (pentru cautarea unei chei intr-un fisier dicţionar); exemplul urmator:
• Socket (pentru realizarea de operaţiuni cu socket-van);
• Time::Local (pentru acces la timpul local). (infoiasi)$ pod2text Parser.pm >Parser.txt
Pentru a gasi toate modulele instalate in sistem (inclusiv cele (infoiasi)$ pod2html Parser.pm >Parser.html
care nu au documentaţii sau au fost instalate in afara distribute}
standard) putem folosi urmatoarea linie de comenzi: Prelucrarea documentelor XML
In continuare vom urmari sa prelucram documentele XML via
find "perl -e 'print "@INC"'~ -name "*.pm" -print scrip-turile Perl, in vederea transformarii lor in pagini Web.
Utilizarea analizorului Expat Una dintre cele mai facile modalitati de
In mod normal, fiecare modul poseda propria lui documentaţie, a prelucra documentele XML este cea a utilizarii analizorului
accesi-bila prin intermediul comenzii man din UNIX. Se poate Expat dezvoltat de James Clark, a carui functionalitate este
utiliza si co-manda perl doc. De reţinut faptul ca anumite module incapsulata de modulul XML::Parser. Acest modul va pune la
pot fi scrise in alte limbaje, in speţa C (cazul modulelor Socket sau dispozitie obiectele XML: : Parser si XML:: Parser: : Expat.
POSIX). CPAN Succesul limbajului Perl rezida, in principal, din Analiza XML este bazata pe evenimente, fiecare tip de nod al
posibilitatea de a extinde limbajul cu noi functionality oferite de ar-borelui asociat documentului XML declansandu-se un anumit
eveni-ment care va trebui tratat de o rutina Perl specificata de Dorim sa generam un tabel XHTML cu aceste informatii, prin
programator. Astfel, dupa initializarea analizorului, va trebui sa trans-formarea documentului XML de mai sus. Vom scrie
folosim metoda setHandlers pentru a stabili ce functii vor fi urmatorul script Perl, in care vom substitui fiecare element
apelate pentru fiecare tip de eveniment. XML cu elementele XHTML corespunzatoare (aceste substitutii
Cele mai importante evenimentele generate de procesorul XML vor fi stocate in tablouri asociative):
sunt:
• Start - indica aparitia tag-v&ui de inceput al unui element; #!/usr/bin/perl
• End - desemneaza aparitia tag-ului de sfarsit al unui element; # utilizam modulul XML
• Char - indica aparitia continutului text al unui element use XML: :Parser;
(caracterele de i definim tablourile hash de inlocuire a tag-urilor
text neprocesat dintre tag-\& de inceput si eel de sfarsit); i definim substitutiil e de tag-uri de inceput
• Comment - indica aparitia unui comentariu. %start = (
Intr-un prim exemplu de utilizare a modulului XML::Parser "imprumuturi " => "<table border=\"l\">",
vom asocia pentru evenimentele Start, End si Char cate o "imprumut" => "<tr>",
subrutina care va fi apelata la fiecare aparitie a evenimentului in "carte" => "<td><b>",
cauza. "client" => "<td align=\"center\">"
Documentul XML bi bl i o. xml care urmeaza stocheaza );
informatii despre imprumuturile dintr-o biblioteca: i definim substituti il e de tag-uri de sfirsit
SKsfirsit = (
<?xml version="1.0" ?> "imprumuturi" => "</tabl e>\n",
<imprumuturi > <imprumut> "imprumut" => "</tr>",
<carte autor="H. Hesse" an="1999"> "carte" => "</bX/td>",
Lupul de stepa </carte> <client "client" => "</td>"
adresa="mituc@ac.tuiasi.ro">
Victor Tarhon-Onu
</client> </imprumut> i instantiem analizorul XML
<imprumut> my $parser = new XML: : Parser( ErrorContext => 2);
<carte autor="H. Hesse" an="1998">
i setam functiile de prelucrare
Jocul cu margelele de sticla </carte> # a elementelor si continutului lo r
<client adresa="mihaela@infoiasi.ro"> $parser->setHandlers(
Mihaela Brut
Start => \&procesare_start, # functia de
</client> </imprumut>
procesare tag-uri de inceput End => \
</imprumuturi>
&procesare_sfi rsit, i functia de procesare
tag-uri de sfirsit Char => \
&procesare_continut i functia de procesare a
continutului
sub procesare_sfirsit
my $procesor = shift;
i primul argument este instanta procesorului XML
my $element = shift;
# al doilea argument este numele elementului
# corespunzator tag-ului de sfirsit
procesare_continut
i am preluat argumentele furnizate concepem o rutina de tratare a fiecarei apariţii a tag-v&ui de sfarsit.
my ($procesor, $data) = @_; Tot in cadrul acestui exemplu vom vedea cum putem accesa
valorile atributelor unui element, prin utilizarea unui tablou
i afisam datele asociativ.
print $data; Codul sursa al scriptului este:
dbi:Oracle:studenti
Vom prezenta un script simplu care poate fi utilizat pentru căutarea unor clienţi ai unei organizaţii sau
companii stocaţi într-o bază de date fcs cu următoarea structură a unicei tabele clients:
CREATE TABLE clients (
# identificator client
id_client int(11) NOT NULL default '0',
# nume client
name varchar(50) NOT NULL default '',
# adresa client
address varchar(100) NOT NULL default '',
# oras
city varchar(30) NOT NULL default '',
# cod postal
zip varchar(10) NOT NULL default '',
# telefon (serviciu tehnic)
tech_phone varchar(20) NOT NULL default '',
# fax (serviciu tehnic)
tech_fax varchar(20) default NULL,
# e-mail (serviciu tehnic)
tech_email varchar(100) NOT NULL default '',
# persoana contact (serviciu tehnic)
tech_contact varchar(50) NOT NULL default '',
# telefon (serviciu comercial)
com_phone varchar(20) NOT NULL default '',
# fax (serviciu comercial)
com_fax varchar(20) default NULL,
# e-mail (serviciu comercial)
com_email varchar(100) NOT NULL default '',
# persoana contact (serviciu comercial)
com_contact varchar(50) NOT NULL default ''
) TYPE=MyISAM PACK_KEYS=1;
Aceste două comenzi SQL le vom putea stoca într-un fişier clients.sql pentru a-l utiliza la crearea şi
popularea cu date a bazei de date.
Sursa script-ului Perl pe care îl vom numi search.pl.cgi este prezentată în continuare (tratarea
erorilor se va realiza exclusiv de către programator, nefiind automată):
#!/usr/bin/perl -w
<html>
<body bgcolor="white">
<form action="search.pl.cgi" method="post">
<table width="90%" bgcolor="#FFFFFF" border="1" align="center">
<tr><td colspan="5">
HTML
# acest CGI poate fi apelat fara nici un parametru, caz in care va afisa
# un meniu din care sa se selecteze un eventual client
$form{$name}=~s/%(..)/pack("c",hex($1))/ge;