I/O folosind Pipe si Apelarea functiilor sistem.
dz285u7216tzzg Exemplu: Afisarea spatiului ocupat de fisiere pe disc.
#! usr/bin/perl
# Afisarea spatiului ocupat de fisierele specificate 27285udm16tzg7l
# Acest program apeleaza functia sistem (Unix) du din care obtine numele # fisierului si numarul de bytes ocupati, si reuneste aceste informatii cu alte # informatii utile
dz285u7216tzzg
$files = join(' ',@ARGV);
dz285u7216tzzg
# Semnul | redirecteaza datele afisate de du catre programul nostru
if(! open(DUPIPE,"du -sk $files | sort -nr |")){
die "Nu pot rula du! $!\n";
}
printf "%8s %-8s %-16s %8s %s\n",'K-Bytes','Login','Nume','Modificat','Fisier';
while (<DUPIPE>){
# proceseaza informatiile afisate de du
($kbytes,$filename) = split;
# apel sistem pentru aflarea mai multor informatii despre fisier
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime) = stat($filename);
#apel sistem pentru a asocia login si nume cu uid
if($uid != $previous_uid){
($login,$passwd,$uid,$gid,$quota,$coment,$realname,$dir,$shell) = getpwuid($uid);
$realname = split(', ',substr($realname,0,20));
$previous_uid = $uid;
}
# Converteste timpul ultimei modificari intr-o forma mai usor de citit
($sec,$min,$hour,$mday,$mon,%myear) = localtime($mtime);
$mmonth = $mon + 1;
printf "%8s %-8s %-16s %02s-%02d-%02d %s\n",$kbytes, $login,$realname,$myear,$mmonth,$mday,$filename;
}
Exemplu de rezultat afisat de program:
dz285u7216tzzg
K-bytes Login Nume Modificat Fisier
12345 mr28602 Muresan Robert 99-10-10 abc.txt
12. Cautare.
dz285u7216tzzg Cautarea implica folosirea unor sabloane numite expresii regulare. Dupa cum se va vedea, aceasta da nastere la al patrulea paradox Perl: Regular expresion aren't. Expresiile regulare nu sunt(regulare).
Operatorul =~ efectueaza cautarea dupa un sablon si inlocuirea. de exemplu, daca
$s = 'Unu doi trei patru'';
atunci
if ($s =~/doi trei/) {print YES} else {print NO}
va tipari YES, deoarece sirul de caractere $s se potriveste cu sablonul "doi trei"
if($s =~/unu/){print YES} else {print NO}
va tipari NO deoarece sirul nu se potriveste cu sablonul. Adaugand insa optiunea i pentru a ignora diferenta intre caracterele mari si caracterele mici, atunci urmatoarele linii vor afisa YES.
if($s =~ /one/i) {print YES} else {print NO}
Sabloanele pot contine o serie larga de optiuni pentru a face cautarea cat mai flexibila si generala.De exemplu un .(punct) se potriveste cu orice caracter, exceptand caracterul \n.
if($s =~ /l.mp/){print YES}
va tipari YES pentru $s = "lamp", "lump", "slumped", dar nu si pentru $s = "lmp",sau "less amperes".
Parantezele () grupeaza elementele sablonului. Un asterisk * inseamna ca, caracterul, elementul, sau grupul de elemente anterior poate sa apara de mai multe ori sau deloc.Simila plus + inseamna ca elementul sau grupul de elemente anterior trebuie sa apara cel putin odata.Semnul intrebarii se potriveste cu o singura aparitie sau nici o aparitie.Exemple:
/fr.*nd/ se potriveste cu "frnd", "friend", "front and back"
/fr.+nd/ se potriveste cu "frond", "friend", "front and back"
dar nu se potriveste cu "frnd".
/10*1/ se potriveste cu "11", "101", "1001", "100000001".
/b(an)*a/ se potriveste cu "ba", "bana", "banana", "banananana"
/flo?at/ se potriveste cu "flat" and "float"
dar nu se potriveste cu "flooat"
Parantezele patrate[] se potrivesc cu un singur caracter definit de ele. De exemplu:
[0123456789] se potriveste cu orice cifra
[0-9] se potriveste cu orice cifra
[0-9]+ se potriveste cu orice secventa de cifre
[a-z]+ se potriveste cu orice cuvant scris cu litere mici
[A-Z]+ se potriveste cu orice cuvant scris cu litere mari
[ab n]* se potriveste cu sirul null "", sirul "b", orice numar de spatii,"banana an nnna"
[^...] se potriveste cu orice caracter care nu este "..."
[^0-9] se potriveste cu orice caracter care nu este cifra
dz285u7216tzzg
Acoladele permit o specificare mult mai precisa a sirurilor care se repeta. Astfel [0-9]{6} se potriveste cu orice sir de cifre de lungime 6, iar [0-9]{6,10} se potriveste cu orice sir de cifre care are lungime cuprinsa intre 6 si 10.
Sabloanele pot sa apara oriunde in sirul de caractere daca nu sunt ancorate.Semnul ^ pus in afara parantezelor patrate[], ancoreaza sablonul la inceputul sirului de caractere, iar caracterul $ ancoreaza sablonul la sfarsitul sirului de caractere.De exemplu:
/at/ se potriveste cu "at", "attention", "flat", si "flatter"
/^at/ se potriveste cu "at" si "attention" dar nu si cu "flat"
/at$/ se potiveste cu "at" si "flat", dar nu si cu "attention"
/^at$/ se potriveste doar cu "at".
/^at$/i se potriveste cu "at", "At", "aT", si "AT".
/^[ \t]*$/ se potriveste cu o linie goala, sau cu o linie ce contine oreice combinatie de spatii libere sau taburi
Caracterul Backslash. In general caracterele se potrivesc cu ele insele, cu exceptie caracterelor speciale de control cum ar fi:+ ? . [] () {}. Acestea trebuie prefixate cu un backslash \ pentru a fi considerate ca si caractere.
Bara verticala | este operatorul binar sau. Exemplu:
if ($answer =~/^y | ^yes |^yeah/i){
print "Afirmativ";
}
va afisa "Afirmativ" pentru: y, yes, Yes, Yeah, Yeah rigth,etc...