Getpage

Un Cadou de Sărbători:
o carte în format HTML
sau un întreg site ?

Apărut spre sfârșitul anilor '80, ca rezultat al necesității unui limbaj scriptural simplu, pentru procesarea fișierelor text, limbajul PERL pare să-și păstreze un loc sigur în loja limbajelor practice, lucru dovedit și prin noua sa versiune 5. Limbaj interpretat, optimizat pentru scanarea și extragerea de informații din fișierele text și tipărirea de rapoarte bazate pe aceste informații, Perl-ul a fost conceput pentru a fi simplu de utilizat, eficient și complet. Este, totodată, un limbaj bun pentru multe activități de administrare a unui sistem Unix și pentru crearea de scripturi CGI (programare legată de Internet și HTML) .

În opinia autorului său, Larry Wall, Perl-ul (Practical Extraction and Report Language) combină multe din cele mai bune caracteristici ale binarelor sh, awk, sed și are unele asemănări cu Pascal și csh. Scripturile Perl ce folosesc setuid sunt mai sigure decât programele C, lucru obținut printr-un mecanism de evitare a „găurilor“ de securitate.

Perl-ul este un limbaj ușor de învățat, datorită unei familiarități obținută din asemănarea cu alte limbaje clasice (cunoscute). Noua versiune Perl5 a fost total rescrisă, rezultând un interpretor mai rapid și mai flexibil.

Ideea creării unui program, ca cel descris în continuare, a apărut dintr-o necesitate: existența pe Internet a diverselor cărți și documentații în format HTML, dar care nu puteau fi salvate local ca o arhivă. Încercarea de a salva fișier cu fișier tot ce îți trebuie, inclusiv pozele și background-urile, se dovedește mai costisitoare ca scrierea unui program ce face acest lucru automat. Amintim faptul că informația de care discutăm se află organizată într-o structură arborescentă de directoare. Astfel, pentru a recompune local configurația de pe mașina de la distanță, trebuie ori create aceste directoare și unele fișiere mutate acolo, ori modificate paginile HTML salvate … Și cum scrierea unui program pare o muncă mult mai interesantă decât prima alternativă, am ales-o pe aceasta.

Getpage este un progrămel instructiv, pentru programarea în Perl și simplu de folosit: getpage <host> <path> . De exemplu: getpage www.mcs.anl.gov/dbpp/text/ book.html vă va aduce o întreagă carte despre Programarea Paralelă și Distribuită de la Argonne National Laboratory, ce se ocupă de un proiect de publicare online pentru Addison-Wesley inc., pe când getpage -1 www.perl.com/CPAN/src/latest .tar.gz vă va aduce doar arhiva ultimei distribuții de Perl.

Utilizând facilitățile Perl-ului de manipulare a șirurilor de caractere (extragere, concatenare, vectorizare șiruri de caractere și ușurința pattern-matching-ului), am creat mai întâi un progrămel ce, primind un fișier Index (table of contents), îl parcurge și memorează legăturile relative (de exemplu: <A HREF="folder/file.html">) într-un vector. Acesta este apoi parcurs și se salvează fiecare link.

Acesta este doar începutul. Într-o versiune mai evoluată, programul filtrează fiecare fișier adus, inclusiv primul. Filtrarea presupune extragerea link-urilor către imagini, eventual sunete. În acest fel, se pot transfera atât fișiere text cât și binare (GIFs, JPEGs, *.class, *.wav sau orice alt tip de fișiere). Singura diferență față de varianta prezentată o găsim în instrucțiunea care selectează linii din documentul salvat.

În loc de:

 $Lines'$i ++' = $_ if /.*href.*/i 

vom scrie:

 $Lines'$i ++' = $_ if /.*src.*/i . 

Încercați ca exercițiu aceasta.

Dacă scanăm fiecare fișier salvat și memorăm legăturile interne, vom putea salva recursiv o întreagă structură de directoare.

Apar însă următoarele probleme:
1. trebuie să creăm local o structură de directoare similară cu cea de la distanță;
2. nu trebuie să procesăm un fișier salvat anterior, pentru că acest lucru creează o buclă infinită.

Soluție: păstrăm istoria salvărilor într-o listă specială. Varianta prezentată în listing cât și cea care se găsește la adresele: http://apolo.cs.pub.ro/~bogo/getpage/index.html și http://disco.cs.pub.ro/~bodiz/getpage/index.html nu este recursivă, acest lucru fiind însă avut în vedere de către autori pentru un proiect viitor.

Un avantaj al Getpage-ului, care a fost exploatat de noi, este acela că el poate fi lăsat să lucreze în background cu prioritate mică, util mai ales în cazul transferului unui număr foarte mare de fișiere.

Cu toate că se pornește din linia de comandă, am creat pentru Getpage și două tipuri de interfețe. Una în TCL/TK cu Visual Tcl care rulează sub Xwindow și apelează în spate pur și simplu Getpage-ul. Alta, o pagină de HTML încărcată în Netscape care poate apela un script aflat pe un calculator de la distanță (de exemplu http:// disco.cs.pub.ro/cgi-bin/getpage/getpage.pl) dar care este nerecomandată datorită încărcării mașinii ce rulează scriptul. Serverul salvează local toate fișierele și le trimite arhivate în format tgz spre noi.

Un program asemănător Getpage-ului și foarte complet există și pe Internet. El face parte din pachetul Snag-o-rama și îl puteți găsi la adresele : http://www.wg.omron.co.jp/~jfriedl/perl/ și http://enterprise.ic.gc.ca/~jfriedl/perl.

Pentru a putea testa Getpage sau Snag, aveți nevoie de Perl 5.004 sau mai nou. PERL-ul se găsește free la adresele de pe Internet: http://www.perl.com/CPAN/src/latest.tar.gz sau la noi la: ftp://ftp.dnttm.ro/pub/CPAN/

CPAN reprezintă inițialele de la Comprehensive Perl Archive Network unde sunt adunate laolaltă toate materialele și contribuțiile relative la Perl. Ele sunt oglindite pe site-uri din diverse colțuri ale lumii pentru un acces mai rapid la informații.

Un bun punct de plecare pentru documentație referitoare la Perl este site-ul oficial de la : http://www.perl.com .

Pentru orice întrebări sau detalii, autorii sunt bucuroși să vă stea la dispoziție.


BYTE România - decembrie 1997


(C) Copyright Computer Press Agora