Literali si Operatori, Bucle si sistemul IO in Perl



Literali si Operatori


Exemple: Numere si Caractere


#!usr/bin/perl

print '013' , 'este numar prim', 004, ' nu este numar prim.';



print 7 + 3,' ' , 7 - 3

$x = 7;

print $x

print 'Nu afiseaza variabila $x si linie noua n .'

print 'Afiseaza $x si line noua n'

$y = 'Linie ce contin $x si se termina cu salt la linie noua n.'

print $y;

$y = 'Con'.'catena'.'re';

print $y


Acest program va afisa:


013 este numar prim 4 nu este numar prim. 10 4 Nu afiseaza variabila $x si linie noua n.Afiseaza 7 si linie noua

Linie ce contine 7 si se termina cu salt la linie noua

Concatenare


Observam ca instructiunea print nu sare la linie noua decat daca se specifica caracterul n intre ghilimele ''. Aceasta o greseala des intalnita in programele Perl.

Totodata observam operatorul . (punct) care are ca efect concatenarea celor trei siruri de caractere.


Exemple: Comparatiile


O greseala des intalinta in programele Perl este confundarea operatorului de atribuire = cu operatorul de comparare numerica ==.

Totodata este recomandata folosirea operatorilor eq, ne, lt, gt pentru siruri de caracatere:


if ( $x eq 'unu')



Bucle si sistemul I/O in Perl.


Exemplu: Parametrii in linia de comanda si bucle iterative


print '$#ARGV este indicele ultimului argument din linia de comanda.n'


# Itereaza de la indicele 0 pana la indicele $#ARGV:

# Observam ca , constructia for este similara cu cea din C


for($i = 0; $i <= $#ARGV; $i++)



# O alta varianta a buclei de mai sus


foreach $item(@ARGV)



# O varianta similara folosind de data asta variabila implicita Perl $_


foreach (@ARGV)



Rularea programului va afisa:


> perl exemplu.pl Buna Dimineata, Elevi!

2 este indicele ultimului argument din linia de comanda

Parametrul 0 este Buna.

Parametrul 1 este Dimineata,.

Parametrul 3 este Elevi!

Cuvantul este: Buna.

Cuvantul este: Dimineata,.

Cuvantul este: Elevi!

Spun: Buna.

Spun: Dimineata,.

Spun: Elevi!.


Exemplu: Sistemul standard I/O


print STDOUT 'Tastati un text: ';

while($input = <STDIN>)


print STDOUT 'Mai tastati ceva sau apasati CTRL - D pentru terminare'

}

print STDOUT 'Atat a fost.'


Obs1. Conditia din directiva while este o directiva de asignare, asigneaza urmatoarea inregistrare de la intrarea standard, variabilei $input. La sfarsit de fisier acesta nu va asigna variabilei $input valoarea null, ci o valoare nedefinita, care in acest context este evaulata ca fiind null. Deci lini a while($input = <STDIN>) face trei lucruri: citeste o inregistrare, o asigneaza variabilei $input si verifica daca $input este nedefinita, in acest context ea fiind evaluata la valoarea null. In alte contexte, Perl evauleaza o variabila ca fiind zero sau null. De exemplu daca $i nu este definita, atunci $i++ va atribui variabilei $i valoare 1. De aici rezulta al treilea paradox Perl: Side effects can yield an elegant face or a pain in the rear. Efectele secundare pot conduce la lucruri elegante sau batai de cap.

Obs2. Campurile de date sunt in mod implicit delimitate de caracterul n, care in exemplul de mai sus este inclus ca si ultimul caracter al variabilei $input. Functia chop elimina acest ultim caracter din variabila $input. In Perl 5 este introdusa o noua functie chomp care elimina ultimele caractere doar daca acestea sunt definite ca delimitatori de inregistrari, prin variabila globala $/.


Exemplu: Executarea unui string ca si porgram Perl


#!usr/bin/perl

for(;;)

if ($@)

if($!)

}


Functia eval, evalueaza un sir de caractere interpretand-ul ca un program scris in Perl. $@ reprezinta mesajul de eroare rezultat din ultimul apel al functiei eval sau do.

Rularea programului va afisa:


>perl perls.pl

() ? sqrt(2)

(1.4142)


Exemplu: I/O cu fisiere


#! usr/bin/perl

# program pentru inversarea fiecarei linii dintr-un fisier.


# 1: Obtinerea numelui fisierelor din parametrii transmisi in linia de comanda


if($#ARGV != 1)

($infile,$outfile) = @ARGV;

if (! -r $infile)


#2: Validarea fisierelor

# Daca prima parte a expresiei in cazul operatorului || (or) este adevarata, Perl # nu mai evalueaza si restul continutului. Daca fisierul de intrare sa putut

# deschide atunci executia programului continua, altfel se evalueaza instructiunea # die si executia programului se incheie.


open($INPUT,'<$infile') || die 'Nu pot deschide fisierul $infile ! n';

if( -e $outfile)

if ($ans eq 'e')

}


if ($ans eq 'a')

else


open(OUTPUT,'$mode$outfile') || die 'Nu pot deschide fisierul destinatie!';


#3: Citeste fiecare linie din fisierul sursa, inverseaza linia si o scrie in fisierul # destinatie


while(<INPUT>)


#4: Terminare


close INPUT, OUTPUT;

exit;