# Câteva exemple care evidențiază modul în care se comportă # operatorii de comparație în diverse contexte. use strict; # use warnings; # Emite avertismente cu privire la utilizarea unor expresii necorespunzatoare # cauzate de apariția unei situații ilogice din punct de vedere matematic. use feature ":5.10"; my $sir1 = undef; my $sir2 = undef; my $rezultat_comparatie = undef; my $rezultat_comparatie_nr = undef; my $rezultat_comparatie_lit = undef; $sir1 = '100'; $sir2 = '30'; $rezultat_comparatie = $sir1 > $sir2; printf "Comparatia sirurilor $sir1 > $sir2 conduce la rezultatul: %-1d\n",$rezultat_comparatie; print "Evaluarea comparatiei este FALSA\n\n" if ($rezultat_comparatie == 0); print "Evaluarea comparatiei este ADEVARATA\n\n" if ($rezultat_comparatie == 1); $rezultat_comparatie = $sir1 < $sir2; printf "Comparatia sirurilor $sir1 < $sir2 conduce la rezultatul: %-1d\n",$rezultat_comparatie; print "Evaluarea comparatiei este FALSA\n\n" if ($rezultat_comparatie == 0); print "Evaluarea comparatiei este ADEVARATA\n\n" if ($rezultat_comparatie == 1); $sir1 = 'agg'; $sir2 = 'ctt'; $rezultat_comparatie = $sir1 > $sir2; printf "Comparatia sirurilor $sir1 > $sir2 conduce la rezultatul: %-1d\n",$rezultat_comparatie; print "Evaluarea comparatiei este FALSA\n\n" if ($rezultat_comparatie == 0); print "Evaluarea comparatiei este ADEVARATA\n\n" if ($rezultat_comparatie == 1); $rezultat_comparatie = $sir1 == $sir2; printf "Comparatia sirurilor $sir1 == $sir2 conduce la rezultatul: %-1d\n",$rezultat_comparatie; print "Evaluarea comparatiei este FALSA\n\n" if ($rezultat_comparatie == 0); print "Evaluarea comparatiei este ADEVARATA\n\n" if ($rezultat_comparatie == 1); $sir1 = '100.0'; $sir2 = '100'; $rezultat_comparatie = $sir1 == $sir2; printf "Comparatia sirurilor $sir1 == $sir2 conduce la rezultatul: %-1d\n",$rezultat_comparatie; print "Evaluarea comparatiei este FALSA\n\n" if ($rezultat_comparatie == 0); print "Evaluarea comparatiei este ADEVARATA\n\n" if ($rezultat_comparatie == 1); $rezultat_comparatie = $sir1 eq $sir2; printf "Comparatia sirurilor $sir1 eq $sir2 conduce la rezultatul: %-1d\n",$rezultat_comparatie; print "Evaluarea comparatiei este FALSA\n\n" if ($rezultat_comparatie == 0); print "Evaluarea comparatiei este ADEVARATA\n\n" if ($rezultat_comparatie == 1); $sir1 = '100'; $sir2 = '30'; $rezultat_comparatie_nr = $sir1 <=> $sir2; $rezultat_comparatie_lit = $sir1 cmp $sir2; printf "Comparatia sirurilor in acest fel $sir1 <=> $sir2 conduce la rezultatul: %-1d\n",$rezultat_comparatie_nr; print "Valoarea variabilei din stanga e mai mare ca cea din dreapta\n"; printf "Comparatia sirurilor in acest fel $sir1 cmp $sir2 conduce la rezultatul: %-1d\n",$rezultat_comparatie_lit; print "Valoarea variabilei din stanga e mai mica ca cea din dreapta\n\n"; $sir1 = 'agg'; $sir2 = 'ctt'; $rezultat_comparatie_nr = $sir1 <=> $sir2; $rezultat_comparatie_lit = $sir1 cmp $sir2; printf "Comparatia sirurilor in acest fel $sir1 <=> $sir2 conduce la rezultatul: %-1d\n",$rezultat_comparatie_nr; print "d.p.d.v. matematic, cele doua siruri comparate sunt identice\n"; printf "Comparatia sirurilor in acest fel $sir1 cmp $sir2 conduce la rezultatul: %-1d\n",$rezultat_comparatie_lit; print "d.p.d.v. literal, sirul din stanga e mai mic decat cel din dreapta\n\n"; # În limbajele de programare comparațiile au la bază următoarele reguli: # Întotdeauna se compară valoarea din stânga cu cea din dreapta. # Întotdeauna, în urma unei comparații, drept rezultat, este returnat un numar. # Acest numar poate fi: 0 sau 1 cu excepția operatorilor <=> și cmp când poate fi și -1. # Prin convenție 0 este asociat întotdeauna cu FALSE. # Prin convenție 1 este asociat întotdeauna cu TRUE. # În cazul particular al operatorilor <=> si cmp: # 0 înseamnă că cele două variabile sunt egale/identice. # 1 înseamna că variabila din stânga e mai mare ca cea din dreapta. # -1 înseamna că variabila din stânga e mai mică ca cea din dreapta. # Când Perl compară două șiruri, ia în considerare primul cel mai din stânga caracter # al fiecărui șir și le compară. Dacă cele două caractere sunt identice, le ia pe # urmatoarele două și acționeaza în acest fel spre dreapta până când identifică # două caractere diferite. Dacă ajunge la capatul șirurilor și nu identifică nicio # diferență, atunci cele două șiruri sunt identice și deci sunt egale. # Dacă identifică o pereche de caractere diferite, atunci cele două șiruri nu sunt identice. # Modul în care cuantifică diferența este dat de poziția caracterului în tabela ASCII. # Un caz particular apare atunci când două șiruri sunt identice în toate pozițiile, # dar unul este mai lung decât celălalt. Într-o astfel de situație șirul mai lung # este considerat mai mare. Ex. acgt cmp acgtt. # De asemenea, trebuie avută foarte mare grijă în alegerea operatorilor de comparație: # matematici vs. literali. Ex. gga == acc va genera TRUE daca nu este activat # modulul warnings. Perl va transforma fiecare caracter la valoarea 0 # și, astfel, șirurile vor fi considerate egale. =pod my $string1 = 'A ACCCCCGTTTX'; my $string2 = 'AACCCCCGTTTAAA'; if ($string1 gt $string2) { say "Sirul $string1 este mai mare decat sirul $string2"; } elsif ($string1 lt $string2) { say "Sirul $string1 este mai mic decat sirul $string2"; } elsif ($string1 eq $string2) { say "Sirul $string1 este identic cu sirul $string2"; } my $comparatie = $string1 cmp $string2; say "Sirul $string1 comparat cu sirul $string2 returneaza: $comparatie"; =cut my $string1 = 'acct'; my $string2 = 'aCctw'; if ($string1 gt $string2) { say "Sirul $string1 este mai mare decat sirul $string2"; } elsif ($string1 lt $string2) { say "Sirul $string1 este mai mic decat sirul $string2"; } elsif ($string1 eq $string2) { say "Sirul $string1 este identic cu sirul $string2"; } my $comparatie = $string1 cmp $string2; say "Sirul $string1 comparat cu sirul $string2 returneaza: $comparatie"; =pod cmp Compare 'a' cmp 'b' # -1 'b' cmp 'a' # 1 'a' cmp 'a' # 0 eq Equal to 'a' eq 'b' # 0 'b' eq 'a' # 0 'a' eq 'a' # 1 ne Not-Equal to 'a' ne 'b' # 1 'b' ne 'a' # 1 'a' ne 'a' # 0 lt Less than 'a' lt 'b' # 1 'b' lt 'a' # 0 'a' lt 'a' # 0 le Less than or equal to 'a' le 'b' # 1 'b' le 'a' # 0 'a' le 'a' # 1 gt Greater than 'a' gt 'b' # 0 'b' gt 'a' # 1 'a' gt 'a' # 0 ge Greater than or equal to 'a' ge 'b' # 0 'b' ge 'a' # 1 'a' ge 'a' # 1 Numeric String Meaning == eq equal != ne not equal < lt less than > gt greater than <= le less than or equal >= ge greater than or equal <=> cmp comparison https://perlmaven.com/comparing-scalars-in-perl https://stackoverflow.com/questions/1175390/how-do-i-compare-two-strings-in-perl =cut