IO folosind Pipe si Apelarea functiilor sistem in Perl



I/O folosind Pipe si Apelarea functiilor sistem.


Exemplu: Afisarea spatiului ocupat de fisiere pe disc.




#! usr/bin/perl

# Afisarea spatiului ocupat de fisierele specificate

# 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


$files = join(' ',@ARGV);


# Semnul | redirecteaza datele afisate de du catre programul nostru


if(! open(DUPIPE,'du -sk $files | sort -nr |'))

printf '%8s %-8s %-16s %8s %sn','K-Bytes','Login','Nume','Modificat','Fisier';


while (<DUPIPE>)


# 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 %sn',$kbytes, $login,$realname,$myear,$mmonth,$mday,$filename;

}

Exemplu de rezultat afisat de program:                   


K-bytes Login Nume Modificat Fisier

12345 mr28602 Muresan Robert 99-10-10 abc.txt


12. Cautare.


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/) else

va tipari YES, deoarece sirul de caractere $s se potriveste cu sablonul 'doi trei'

if($s =~/unu/) else

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


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


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


Acoladele permit o specificare mult mai precisa a sirurilor care se repeta. Astfel [0-9] se potriveste cu orice sir de cifre de lungime 6, iar [0-9] 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)

va afisa 'Afirmativ' pentru: y, yes, Yes, Yeah, Yeah rigth,etc