Stilul de programare Perl. Multe programe utile scrise in Perl sunt scurte. Sa presupunem ca vrem sa schimbam acelasi text in mai multe fisiere. In loc sa editam toate fisierele sau sa construim niste comenzi criptice in find, awk, sau sed , putem scrie o simpla comanda: perl -e 's/rosu/negru/gi' -p -i.bak *.html
Acesta comanda, tastata la un promp Unix, executa programul Perl scris intre ghilimele. Acest program executa o singura operatiune: inlocuieste cuvantul rosu cu cuvantul negru , global, intr-un mod case-insensitive. Restul liniei de comenzi specifica, ca rularea sa se faca pentru fiecare fisier cu extensia .html din directorul curent, iar daca vre-un fisier trebuie modificat (test.html) atunci se va crea o copie de siguranta cu extensia .bak (test.html.bak). 51298jfq96ivg5e Pentru cei acomodati cu stilul de programare C sau Pascal, programul de mai sus poate fi expandat in forma urmatoare astfel incat sa urmareasca stilul de programare din cele doua limbaje de mai sus: (Pascal si C): #!usr/local/bin/perl -w # File: schimb fv298j1596ivvg # Program Perl pentru substituirea cuvantului rosu cu cuvantul negru in toate # specificate in linia de comanda
$vechi = 'rosu'; $nou = 'negru; $nrschimbari = 0;
# Separatorul de inregistrari in fisierele de intrare este definit de variabila globala # Perl: $/ .Poate fi orice sir de caractere. In mod normal este \n . Aici il specificam # ca fiind ca fiind null, deci intreg fisierul va fi citit ca un singur camp
undef $/;
# Presupunand ca programul a fost apelat cu parametrii schimb 1.html, 2.html, # 3.html, atunci lista @ARGV va contine 3 elemente: ('1.html', '2.html, '3.html') # Acestia pot fi accesati prin $ARGV[0], $ARGV[1], $ARGV[2]
foreach $file(@ARGV) { if (! open(INPUT,"<$file")) { print STDERR "Nu pot deschide fisierul $bakfile \n"; next; } # Citesc fisierul de intrare ca si un singur camp de inregistrare $data = <INPUT>; close INPUT;
if ($data =~ s/$vechi/$nou/gi) { $bakfile = "$file.bak"; # Iesire daca nu pot salva fisierul de siguranta sau nu pot deschide fisierul # destinatie if (! rename($file, $bakfile)) { die "Nu pot redenumi $file $!"; } if (! open(OUTPUT,">$file")) { die "Nu pot deschide fisierul destinatie $file \n"; } print OUTPUT $data; close OUTPUT; print STDERR "$file inlocuit \n"; $nrschimbari++; } else { print STDERR "$file nu a fost schimbat\n"; } } print STDERR "$nrschimbari fisiere inlocuite. \n"; exit(0);
Observam din programul de mai sus ca anumite elemente se aseamana cu limbajul C. De exemplu linia in linia !open(INPUT,...) semnul ! este operatorul boolean de negare si se foloseste identic ca si in C, orice valoare pozitiva este adevarata, iar orice valoare pozitiva cu ! in fata este fals, iar 0 cu ! in fata este adevarat. Totodata observam ca si constructia if...else este similara cu ceea din C. In linia $nrschimbari++ observam ca incrementarea unei variabile se face analog ca in C. Filozofia Perl este :"There is more than one way", exista mai multe modalitati. Din acesta nobila libertate de exprimare rezulta prima din cele patru paradoxuri Perl: Programele Perl sunt usor de scris dar nu intotdeauna usor de citit. Pentru exemplificare, urmatoarele linii de cod Perl sunt echivalente. if ($x == 0) {$y = 10;} else {$y = 20;} $y = $x == 0? 10 : 20; $y = 20; $y = 10 if $x == 0; unless ($x == 0) {$y = 0;} else {$y = 10;} if ($x) {$y = 20;} else {$y = 10;} $y = (10,20) [$x != 10];
Observam ca liniile 1, 2 si 5 sunt similare ca si sintaxa cu limbajul C. In multe aspecte Perl este similar cu C, dupa cum vom vedea si in cele ce urmeaza.