Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

Perl: shprehjet dhe operacionet. A2.3.4.18 Logjike AND, OSE dhe XOR

Shprehjet në PERL, si në gjuhët e tjera të programimit, ato janë kombinime variablash, konstantesh dhe operacionesh që japin një rezultat kuptimplotë. Ky rezultat mund të jetë një grup skalar, një grup ose një grup shoqërues.

Të gjitha operacionet PERL ndahen në:

Operacionet I / O përshkruhen në artikull " Perl: përshkruesit e skedarëve", operacionet me shprehjet e rregullta — "Perl: shprehje të rregullta", rubrika "Veprimet me shprehje të rregullta".

Operacionet e krahasimit

Operacionet e krahasimit krahasoni dy operandë dhe ktheni 1 ose 0 në varësi të rezultatit të këtij krahasimi. PERL përmban dy grupe operatorësh krahasimi: për krahasimin e numrave dhe për krahasimin e vargjeve. Veprimet e grupit të parë fillimisht i shndërrojnë operandët në numra dhe më pas i krahasojnë. Veprimet e grupit të dytë i konvertojnë operandët në vargje dhe i krahasojnë me renditja leksikografike. Nëse specifikohet direktiva e përdorimit të vendndodhjes, atëherë krahasimi i kohës kryhet sipas vendndodhjes.

Krahasimi i numraveKrahasimi i vargjeveEmriPërshkrim
a< b a lt b Më pak 1 nëse operandi i majtë është më i vogël se operandi i djathtë.
a > b a gt b Më shumë 1 nëse operandi i majtë është më i madh se operandi i djathtë.
a<= b a le b Jo më 1 nëse operandi i majtë është më i vogël ose i barabartë me operandin e djathtë.
a => b a ge b Jo më pak 1 nëse operandi i majtë është më i madh ose i barabartë me operandin e djathtë.
a == b a eq b Të barabartë 1 nëse operandi i majtë është i barabartë me operandin e djathtë.
a != b a ne b Jo të barabartë 1 nëse operandi i majtë nuk është i barabartë me operandin e djathtë.
a<=>b një cmp b Krahasimi -1 nëse operandi i majtë është më i vogël se operandi i djathtë; 0 nëse janë të barabarta; 1 nëse operandi i majtë është më i madh se operandi i djathtë.

Shembulli tjetër

$a = 299;
$b = 30;
nëse ($a< $b)
{
shtypni "Numri $a është më i vogël se numri $b\n";
}
nëse ($a lt $b)
{
printoni "String $a është më i vogël se vargu $b\n";
}

do të shfaqë mesazhin: Rreshti 299 është më i vogël se rreshti 30 .

Operacionet Boolean

PERL përmban dy grupe operacionet logjike , të cilat janë identike në rezultatin e tyre, por kanë një prioritet të ndryshëm. Ju lutemi vini re se rezultatet e operacioneve AND dhe OR ndryshojnë nga ato të pranuara në gjuhë të tjera programimi.

Operatorët dhe , ose , xor , dhe not kanë përparësinë më të ulët nga të gjithë operatorët PERL. Kjo i lejon ato të përdoren në anën e djathtë të deklaratave pa kllapa shtesë, si:

Hapni HANDLE, "file.dat" ose "Gabim: $!\n";

Përdorimi i operacionit || në këtë shembull do të kërkonte kllapa:

Open(HANDLE, "file.dat") || die "Gabim: $!\n";

Operacionet me bit

Operacionet me bit aplikuar për operandët e përfaqësuar si numrat binare(d.m.th. si bitstrings) dhe ktheni një vlerë që tregon rezultatin e operacionit.

OperacioniEmriPërshkrim
a&b Bitwise DHE Kthen 1 në çdo pozicion biti nëse pozicionet përkatëse të të dy operandëve janë 1.
a | b Në mënyrë bitale OSE Kthen 1 në çdo pozicion biti nëse pozicioni përkatës i të paktën një operand është 1.
a^b XOR në bit Kthen 1 në çdo pozicion të bitit nëse pozicioni përkatës i një operandi është 1.
~a Nga ana tjetër JO operacion unar. Përmbys çdo pozicion bit të operandit.
a<< b Zhvendos majtas ndërrime paraqitje binare operandi i majtë në të majtë me numrin e biteve të specifikuar nga operandi i dytë.
a >> b Zhvendos djathtas Zhvendos paraqitjen binar të operandit të majtë në të djathtë me numrin e biteve të specifikuara nga operandi i dytë.

Operacionet e zhvendosjes zbatohen vetëm për operandët numerikë, por pjesa tjetër operacionet bit zbatohen si për numrat ashtu edhe për vargjet. Nëse një nga operandët e një veprimi bit është një numër, atëherë të dy operandët konvertohen në numra të plotë. Nëse të dy operandët janë vargje, atëherë ato konvertohen në vargje me të njëjtën gjatësi dhe operacioni kryhet në çdo bit të vargjeve që rezultojnë. Kjo na lejon të aplikojmë operacione bit në operandë të çdo gjatësie. Në këtë operacion | | dhe ^ mbuloni vargun më të shkurtër në të djathtë me zero bit, dhe operacioni & shkurton vargun më të gjatë për t'iu përshtatur vargut më të shkurtër. Mund të specifikojmë në mënyrë eksplicite llojin e operacionit duke përdorur thonjëza për vargjet ose 0+ për numrat. Shembuj:

Print 1.9 | 2; # 3 (operandi lundrues i cunguar në numër të plotë)
shtyp 150 | "105"; # 255 (0x96 | 0x69 është e barabartë me 0xFF)
print "150" | "105"; # "155" (në ASCII)
$a = 150;
$b = "105";
printoni 0+$a | 0+$b; # operandë numerikë
shtyp "$a" | "$b"; # operandë vargu

Direktivat e kontrollit aritmetik ndikojnë në ekzekutimin e operacioneve të bitit. Si parazgjedhje, numrat e plotë konsiderohen të panënshkruar, kështu që operacioni i zhvendosjes djathtas mbush bitet e rendit të lartë të rezultatit me zero dhe operacioni ~0 kthen numrin më të madh pozitiv. Direktiva e përdorimit të numrave të plotë bën që numrat e plotë të interpretohen si numra me shenjë. Prandaj, në diapazonin e tij, operacioni i zhvendosjes djathtas mbush bitet e rendit të lartë të rezultatit me bitin e shenjës së numrit dhe operacioni ~0 kthen numrin -1.

Operacione unare

plus unar

plus unar(+) kthen operandin e tij. Përdorimi i vetëm kuptimplotë i këtij operatori është ndarja e emrit të funksionit nga argumentet e tij në kllapa. Merrni parasysh këtë shembull:

print(10 + 20) / 10;

Ndryshe nga pritshmëritë, ky pohim printon jo numrin 3, por numrin 30. Fakti është se kllapat rreth argumenteve të funksionit kanë përparësinë më të lartë në PERL, pra printimi (10 + 20) ekzekutohet përpara pjesëtimit me 10. rezultati arrihet duke përdorur një plus unar përpara kllapave, i cili ul përparësinë e tyre:

Shtyp +(10 + 20) / 10;

unary minus

unary minus(-) anulon shenjën e operandit numerik. Nëse operandi është një varg, atëherë rezultati i mëposhtëm kthehet:

  • nëse vargu fillon me një karakter "+" ose "-", atëherë si rezultat ky karakter zëvendësohet nga ai i kundërt;
  • përndryshe, lidhja e karakterit "-" dhe vargut origjinal kthehet.

Në veçanti, ndërtimet -fjalë dhe "-fjalë" janë ekuivalente.

Krijo një lidhje

rritje dhe zvogëlim

Veprimet ++ dhe -- quhen përkatësisht operacione rritje dhe pakësim. Rritja rrit vlerën e një ndryshoreje numerike me 1. Nëse përdoret si parashtesë (++a), atëherë e kthen vlerën e operandit pasi e rrit atë me 1. Nëse përdoret si postfiks (a++), atëherë ai kthen vlerën e operandit përpara se ta rrisë atë me 1. Nëse operandi i rritjes është një variabël vargu që përputhet me modelin /^**$/, atëherë vargu rritet karakter pas karakteri me një mbështjellje. Shembuj:

Print ++($x = "99"); # "njeqind"
print ++($x = "a0"); # "a1"
print ++($x = "Az"); #"Ba"
print ++($x = "zz"); # "aaa"

Zvogëlimi zbatohet vetëm për variablat numerike dhe zvogëlon vlerën e ndryshores me 1. Nëse përdoret si parashtesë (--a), atëherë ai kthen vlerën e operandit pasi e zvogëlon atë me 1. Nëse përdoret si postfiks ( a--), pastaj kthen operandin e vlerës përpara se ta zvogëlojë atë me 1. Shembuj:

Print --($x = 99); #98
print (($x = 99)--); #99
print --($x = "a0"); # -një

Operacione unare të emërtuara

Operacionet shtesë

Janë dy operacionet shtesë mbi numrat (mbledhja dhe zbritja) dhe një mbi vargjet (lidhja).

Shtypni "1" + "2"; #3
shtypni "1". "2"; # "12"

Operacione shumëzuese

Janë katër operacionet shumëzuese mbi numrat (shumëzimi, pjesëtimi, mbetja e modulit dhe fuqizimi) dhe një mbi vargjet (përsëritje).

OperacioniEmriPërshkrim
a*b Shumëzimi Rikthen produktin e dy operandëve numerikë.
a/b Divizioni Jep koeficientin e dy operandëve numerikë.
a % b Mbetja e modulit Kthen mbetjen e numrit të plotë pas pjesëtimit të operandit të majtë me operandin e djathtë. Numrat lundrues rrumbullakosen në numra të plotë përpara operacionit. Nëse b është negativ, atëherë rezultati është gjithashtu negativ.
a**b Eksponentimi E kthen a në fuqinë e b .
a x b Përsëritje Operandi i majtë duhet të jetë një varg ose listë, operandi i djathtë duhet të jetë një numër. Kthen operandin a të përsëritur b herë.

Shtypni "-" x 80; # printon një varg minusesh
@ones = (1) x 5; # @ones = (1, 1, 1, 1, 1)
@ones = (2) x @ones; # @ones = (2, 2, 2, 2, 2)

Operacionet e caktimit

Operacionet e caktimit cakto operandit të majtë rezultatin e veprimit, i cili përcaktohet nga operandi i djathtë dhe vetë operacioni. Operatori bazë i caktimit është a = b , që do të thotë: caktoni vlerën e operandit b në ndryshoren a. Të gjithë operatorët e tjerë të caktimit janë stenografi për operatorët e tjerë të caktimit, siç tregohet në tabelën e mëposhtme.

OperacioniKuptimi
a += b a = a + b
a -= b a = a - b
a .= b a = a. b
a *= b a = a * b
a /= b a = a / b
a %= b a = a % b
a x= b a = a x b
a **= b a=a**b
a<<= b a = a<< b
a >>= b a = a >> b
a &= b a = a&b
a |= b a = a | b
a ^= b a=a^b
a &&= b a = a && b
a ||= b a = a || b

Operatori i caktimit kthen operandin e tij të majtë dhe për këtë arsye mund të përdoret në anën e majtë të operatorit tjetër të caktimit. për shembull

($a += 2) *= 3;

ekuivalente me

$a += 2;
$a *= 3;

Caktimi i një liste në një listë kthen një listë të variablave që u janë caktuar vlerat. Caktimi i një liste në një skalar kthen numrin e elementeve në atë listë.

q-operacionet

Në shumicën e gjuhëve të programimit, thonjëzat përdoren për të formuar konstante vargu. Sidoqoftë, në PERL ato janë operacione që ofrojnë interpolim të vargut dhe përputhje të modelit. Ne do t'i quajmë operacione të tilla q-operacionet(nga fjalë angleze citat, d.m.th. PERL përmban dy grupe q-operacionesh, të listuara në tabelën e mëposhtme.

Kuotatq-operacioniKuptimiInterpolimi
"" q() Konstante Jo
"" qq () Konstante po
`` qx() Ekipi Po (nëse kufijtësit nuk janë "")
qw () Lista e fjaleve Jo
qr () Shprehje e rregullt Po (nëse kufijtësit nuk janë "")
// m() Përputhja e modelit Po (nëse kufijtësit nuk janë "")
s()() Zëvendësimi Po (nëse kufijtësit nuk janë "")
tr()() Transliterimi Vetëm sekuencat e arratisjes

Këtu, në vend të kllapave (), mund të përdorni çdo karakter që nuk është shkronjë, numër ose hapësirë, ose ndarës të çiftëzuar: (), , (),<>. Janë dhënë shembuj të përdorimit të konstrukteve q për të krijuar konstante vargu pika 6.2.3.2; Për përdorimin e tyre në shprehje të rregullta, shih pika 6.4.6 .

Operacione të tjera

Deaddressing

Operacioni de-adresimi duket si:

Operacionet lidhëse

Shumica e operacioneve në shprehjet e rregullta funksionojnë me ndryshoren speciale $_. Për përputhjen e modeleve vargje arbitrare përdoren operacionet e lidhjes, të cilat duken si:

A =~ ba !~ b

ku a është çdo shprehje e vargut dhe b është një model për t'u përshtatur, zëvendësuar ose transliteruar. Operatori =~ kthen true nëse përputhja, zëvendësimi ose transliterimi ishte i suksesshëm, dhe false ndryshe. Operacioni !~ kthen mohimin logjik të rezultatit =~. Për shembuj se si të përdoren këto operacione, shih pika 6.4.6 .

Vendosja e diapazonit

Operacioni vendosja e diapazonit duket si:

Ato janë në fakt dy operacione të ndryshme në varësi të kontekstit. Në kontekstin e listës, ky operacion kthen një listë vlerash (a a+1 ... b). Për vargjet, diapazoni formohet duke përdorur rritje, Për shembull:

Foreach (1..10)
{
# sythe 10 herë
}
@a = @a[$#a-4 .. $#a]; # shkurton pesë elementët e fundit
@a = ("abc".."abe"); # @a = ("abc", "abd", "abe")

Në kontekstin skalar, ky operacion sillet si një shkas që ka dy gjendje dhe kthen true ose false. Secili prej operacioneve.. ruan gjendjen e vet. Është false përderisa operandi i tij i majtë është false. Pasi operandi i majtë është bërë i vërtetë, ky operacion është i vërtetë për sa kohë që operandi i djathtë është false. Pasi operandi i duhur të bëhet true, ky operacion përsëri kthehet false.

Rezultati nuk bëhet fals deri në thirrjen tjetër për këtë operacion. Operacioni.. mund të testojë operandin e duhur dhe të bëhet fals në të njëjtën kohë që vlerësohet në true, por sapo të kthehet true. Nëse duam që ai të mos vlerësojë operandin e duhur deri në thirrjen tjetër në të, atëherë duhet të përdorim formularin

Përndryshe, operacionet .. dhe ... janë identike. Operandi i djathtë nuk vlerësohet ndërsa operacioni është i gabuar, dhe operandi i majtë nuk vlerësohet ndërsa operacioni është i vërtetë. Vlera e kthyer nga ky operacion është vijë bosh në gjendje false, dhe numra të plotë të njëpasnjëshëm duke filluar nga 1 në gjendje të vërtetë. Numri i sekuencës rivendoset për diapazonin e ri. TE numri i fundit vargu, shtohet vargu "E0". Nëse ndonjë nga operandët është një konstante, atëherë ai krahasohet në mënyrë implicite me variablin special $. (që përmban numrin linjë aktuale skedari aktual). Hapet shembulli i mëposhtëm dosjen e dhënë dhe printon rreshtat e tij një deri në pesë.

Hap HANDLE, "filename.ext";
derisa ( )
{
print nëse (1..5);
}

Operacioni i kushtëzuar

Operacioni i kushtëzuarështë një operacion tresh që duket si:

provë? vlera 1: vlera 2

ku test , vlera 1 dhe vlera 2 janë çdo shprehje. Nëse testi është i vërtetë, atëherë operacioni kthen vlerën1, përndryshe kthen vlerën2. Shembull:

Printf "Kam %d%s tjetër.\n", $n, ($n == 1) ? "g" : (($n< 5) ? "га" : "зей");

Ky operator mund të përdoret në anën e majtë të një operatori caktimi nëse të dyja vlerat 1 dhe vlera 2 janë variabla, për shembull:

($test ? $a: $b) = $c;

Presja e operacionit

Presja e operacionit shkakton vlerësimin sekuencial të vlerave të dy shprehjeve dhe kthen të dytën prej tyre. Ajo duket si:

Expr1, expr2

ku expr1 dhe expr2 janë çdo shprehje. Në lista, presja shërben si ndarës midis artikujve të listës.

PERL përmban një sinonim për këtë veprim të formularit

expr1 => expr2

Kjo formë zakonisht përdoret për elementët e listës së çiftuar, për shembull, kur inicializohen vargje shoqëruese. Gjithashtu, nëse operandi i majtë i operatorit => është një fjalë, atëherë ai interpretohet si një varg (shih më poshtë). pika 6.2.7)

Rendi i Operacioneve

Gjatë vlerësimit të shprehjeve, PERL merr parasysh prioriteti i funksionimit: Operacionet me prioritet më të lartë kryhen së pari. Për të ndryshuar rendin e veprimeve, përdorni kllapa: Shprehja e mbyllur në to ka përparësinë më të lartë. Tabela e mëposhtme liston të gjithë operatorët e gjuhës PERL në rend zbritës të përparësisë së tyre; Operacionet e vendosura në të njëjtin rresht të tabelës kanë përparësi të barabartë dhe kryhen ose nga e majta në të djathtë ose nga e djathta në të majtë, siç tregohet në tabelë.

OperacioniAsociativiteti
termat dhe listat majtas
-> majtas
++ -- Nr
** drejtë
! ~ \ + (unar) - (unar) drejtë
=~ !~ majtas
* / % x majtas
+ - . majtas
<< >> majtas
të emërtuara operacione unare Nr
< > <= >= lt gt le ge Nr
== != <=>eq ne cmp Nr
& majtas
| ^ majtas
&& majtas
|| majtas
.. ... Nr
?: drejtë
= op= drejtë
, => majtas
jo drejtë
dhe majtas
ose xor majtas

Ka disa mënyra për të krahasuar objektet në Perl. Ju mund të kontrolloni për barazinë e vlerave duke përdorur operatorin infix ===. Për objektet e pandryshueshme (vlerat e të cilëve nuk mund të ndryshohen, fjalë për fjalë. Për shembull, një fjalë për fjalë 7 do të jetë gjithmonë 7) kjo është krahasim i zakonshëm vlerat. Për shembull "hello"==="përshëndetje" është gjithmonë e vërtetë sepse të dy vargjet janë të pandryshueshme dhe kanë të njëjtën vlerë.

Për objektet e ndryshueshme, === krahason identitetin e tyre. === kthen true nëse argumentet e tij janë pseudonime të të njëjtit objekt. Ose dy objekte janë identike nëse janë i njëjti objekt. Edhe nëse të dy vargjet @a dhe @b përmbajnë vlera të njëjta, nëse kontejnerët e tyre janë objekte të ndryshme, ato do të kenë identitete të ndryshme dhe nuk do të jenë identike kur krahasohen me === :

@a ime = 1, 2, 3; my @b = 1, 2, 3; thuaj @a === @a; #1 thuaj @a === @b; # 0 # identiteti i përdorur këtu le të themi 3 === 3; # 1 thuaj "a" === "a"; # 1 my $a = "a"; thuaj $a === "a"; #një

Operatori eqv kthen True nëse dy objekte janë të të njëjtit lloj dhe strukturë. Pra, për @a dhe @b në shembull, @a eqv @b është e vërtetë sepse @a dhe @b përmbajnë të njëjtat vlera. Nga ana tjetër, "2" eqv 2 do të kthejë False, pasi argumenti në të majtë është një varg dhe në të djathtë është një numër, dhe kështu ato janë të llojeve të ndryshme.

Ashtu si == konverton argumentet e tij në numra, operatori infix eq krahason barazinë e vargjeve, duke i konvertuar argumentet në vargje nëse është e nevojshme.

Nëse $përshëndetje eq "përshëndetje" (thoni "mirë se erdhët"; )

Operatorët e tjerë krahasojnë vargjet nga ana leksikografike.

Në fakt një formë më e përshtatshme për !==, e cila nga ana tjetër është një lidhje e operatorit meta! dhe operatori infix == . I njëjti shpjegim vlen edhe për ne dhe!eq .

Operatorët e krahasimit me tre drejtime marrin dy operandë dhe kthejnë Rendit::Rritja nëse operandi në të majtë është më i vogël, Rendi::Njëlloj nëse është i barabartë, Rendi::Zvogëloni nëse operandi në të djathtë është më i vogël (Order::Increase , Rendit ::Same and Order: :Decrease are enums; shih). Për krahasime numerike, përdorni operatorin<=>, kurse për vargjet është këmbë (nga anglishtja l esser, e qual, g reater). Operatori cmp infix është gjithashtu një operator krahasimi që kthen tre rezultate krahasimi. E veçanta e tij është se varet nga lloji i argumenteve: krahason numrat si<=>, vargjet si këmbë dhe (për shembull) çiftet fillimisht krahasojnë çelësat dhe më pas vlerat (nëse çelësat janë të barabartë).

Thuaj 10<=>5; # +1 thuaj 10 këmba 5; # sepse "1" lt "5" thonë "ab" këmbën "a"; # +1, krahasim leksikografik

Një aplikim tipik i operatorëve të përmendur të krahasimit me tre drejtime është renditja. Metoda .sort në lista merr një bllok ose funksion që krahason dy argumentet e tij dhe kthen vlera negative nëse më pak se 0 nëse argumentet janë të barabarta dhe më të mëdha se 0 nëse argumenti i parë është më i madh se i dyti. Këto rezultate përdoren më pas në renditje për të formuar rezultatin.

Thuaj~ .rendit; # output: Konkret abstrakt thuaj ~ .sort: -> $a, $b ( uc($a) këmba uc($b) ); # prodhim: beton abstrakt

Renditja e paracaktuar është e ndjeshme ndaj shkronjave të vogla, d.m.th. shkronjat e mëdha janë "më të mëdha" se shkronjat e vogla. Shembulli përdor renditje të pandjeshme ndaj rasteve.

Operatorë të ndryshëm krahasimi hedhin argumentet e tyre në lloje specifike përpara se t'i krahasojnë ato. Kjo është e dobishme kur kërkohet një krahasim specifik, por llojet e parametrave janë të panjohur. Perl 6 ofron një operator të veçantë që lejon krahasimet "Bëj gjënë e duhur" duke përdorur ~~, operatori "i zgjuar" i krahasimit.

Nëse $pints-drunk ~~ 8 (thoni "Shkoni në shtëpi, ju keni ngopur!"; ) nëse $country ~~ "Sweden" (thoni "Qofte me manaferra dhe patate, ju lutem.") përveç nëse $group-size ~~ 2..4 (thoni "Duhet të keni midis 2 dhe 4 persona për të rezervuar këtë turne."; )

Operatori i përputhjes inteligjente vendos gjithmonë se çfarë lloj krahasimi të bëjë në varësi të llojit të vlerës në anën e djathtë. Në shembujt e mëparshëm, këto krahasime ishin përkatësisht krahasime numerike, vargjesh dhe diapazoni. Ky kapitull ka demonstruar funksionimin e operatorëve të krahasimit: numrat - == dhe vargjet eq. Megjithatë, nuk ka asnjë operator për krahasimin e intervaleve. Kjo është pjesë e fuqisë së përputhjes "të zgjuar": llojet më komplekse ju lejojnë të zbatoni ide të pazakonta duke kombinuar krahasimet me të tjerët.

Përputhja inteligjente funksionon duke thirrur metodën ACCEPTS në operandin e djathtë dhe duke e kaluar atë operandin e majtë si argument. Shprehja $përgjigje ~~ 42 zbret në thirrjen 42.PRANON($përgjigje) . Ky informacion do të jetë i dobishëm ndërsa lexoni kapitujt pasues mbi klasat dhe metodat. Ju gjithashtu shkruani gjëra që mund të bëjnë përputhje "të zgjuar" duke zbatuar metodën ACCEPTS për ta bërë atë "të funksionojë ashtu siç duhet".

Për të krahasuar të dhënat skalare ose vlerat e ndryshoreve skalare, Perl ofron një grup operacionesh binare që llogaritin marrëdhënie të barabarta, më të mëdha se, më të mëdha se, ose të barabarta me etj. ndërmjet operandëve të saj, prandaj ky grup operacionesh quhet edhe operacionet relacionale. Perl përdor operacione të ndryshme për të krahasuar të dhënat numerike dhe të dhënat e vargut. Të gjitha ato janë paraqitur në tabelë. 4.1.

Tabela 4.1. operacionet e marrëdhënieve

Operacioni Numerike varg Kuptimi
Barazia == eq E vërtetë nëse operandët janë të barabartë, përndryshe false
Pabarazia != ne E vërtetë nëse operandët nuk janë të barabartë, përndryshe false
Më pak < lt E vërtetë nëse operandi i majtë është më i vogël se operandi i djathtë, përndryshe i gabuar
Më shumë > gt E vërtetë nëse operandi i majtë është më i madh se i djathti, përndryshe i gabuar
Më pak ose e barabartë <= le E vërtetë nëse operandi i majtë është më i madh ose i barabartë me operandin e djathtë, përndryshe i gabuar
Më shumë ose e barabartë >= ge E vërtetë nëse operandi i djathtë është më i madh ose i barabartë me të majtën, përndryshe i gabuar
Krahasimi <=> cmt 0 nëse operandët janë të barabartë
1 nëse operandi i majtë është më i madh se i djathti
-1 nëse operandi i djathtë është më i madh se i majti

Rezultati i operacioneve relacionale (me përjashtim të krahasimit të fundit) është True, vlera 1, ose False, vargu bosh "".

Komentoni
Vlera e vërtetë në veprimet aritmetike interpretohet si numri 1, dhe në operacionet e vargut si vargu "1". Vlera e gabuar në veprimet aritmetike interpretohet si numër 0, dhe në operacionet e vargut si një varg bosh " ".

Operacionet e raportit numerik

Operacionet numerike relacionale aplikohen në të dhënat numerike dhe një ose të dy operandët mund të jepen nga një varg që përmban një numër dhjetor të vlefshëm. Nëse ndonjë prej operandeve në një operacion relacional numerik vendoset në një varg përmbajtja e të cilit nuk përfaqëson një numër dhjetor të vlefshëm, atëherë vlera e tij vendoset në o dhe shfaqet një paralajmërim për përdorimin e gabuar të operandit në operacionin relacional numerik ( nëse modaliteti i shfaqjes së paralajmërimit të interpretuesit Perl është i aktivizuar). Kuptimi i veprimeve relacionale për të dhënat numerike korrespondon me operacionet e zakonshme matematikore të krahasimit të numrave (Shembulli 4.7).

123 > 89; # Rezultati: 1 (e vërtetë)

123 < 89; # Результат: "" (ложь)

123 <= 89; # Результат: "" (ложь)

89 <= 89; # Результат: 1 (истина)

23 >= 89; # Rezultati: "" (false)

23 <=>89; # Rezultati: -1 (operandi djathtas më i madh se majtas)

89 <=>23; # Rezultati: 1 (operandi i djathtë më i madh se i majti)

Përdorimi i operacioneve të krahasimit numerik nuk është i vështirë, megjithatë, kur krahasojmë për barazinë e numrave dhjetorë me pikë lundruese, mund të shfaqen efekte rrumbullakimi, të shoqëruara me një numër të kufizuar shifrash domethënëse në mantisën e përfaqësimit të numrave realë në një kompjuter dhe që çojnë në " e pasaktë", nga këndvështrimi i përdoruesit, operacionet e krahasimit . Shembulli 4.8 ilustron një situatë të ngjashme.

#! peri-w
$z = 0,7;

$zz = 10+0,7-10; # Ndryshorja $zz përmban numrin 0.7

# Shtypni vargun "z është i barabartë me zz" nëse $z dhe $zz janë të barabartë print "z është i barabartë me zz\n" nëse ($z == $zz);

Kur përpiqemi të ekzekutojmë Shembullin 4.8, habitemi kur zbulojmë se programi ynë nuk do të printojë asgjë. Per Cfarë bëhet fjalë? Përgjigja qëndron te operatori për llogaritjen e vlerës së ndryshores $zz. Gjatë kryerjes së veprimeve aritmetike, gabimet e rrumbullakimit rezultojnë në një vlerë prej 0.6999999999999999 (mund të futni deklaratën e printimit të ndryshores $zz dhe ta shihni këtë), megjithëse afër 0.7, por jo saktësisht e barabartë me të. Prandaj, operacioni i krahasimit funksionoi si duhet!

Këshilla
Mos përdorni operacionin e krahasimit për barazinë e numrave realë, rezultati i tij mund të mos korrespondojë me atë që pritet nga pikëpamja e matematikës. Nëse keni nevojë të kontrolloni barazinë e dy numrave realë, atëherë është më mirë të krahasoni vlerën absolute të ndryshimit të tyre me një numër shumë të vogël (në varësi të saktësisë së kërkuar):

abs ($a-$b)<= 0.00000001; # Проверка равенства

Operacionet e marrëdhënieve të vargut

Krahasimi i të dhënave të vargut bazohet në renditjen e tyre sipas tabelës së kodit ASCII, d.m.th. karakteri me kodin ASCII më të ulët i paraprin karakterit me kodin më të lartë. Vargjet krahasohen karakter për karakter nga e majta në të djathtë. Kjo do të thotë se nëse karakteret e para të vargjeve janë të barabarta, atëherë krahasohen të dytat dhe nëse janë të barabarta, atëherë krahasohen të tretat, etj. Për më tepër, nëse vargjet janë me gjatësi të ndryshme, atëherë numri i karaktereve që mungojnë për barazi me kodin o shtohet në fund të vargut më të shkurtër. Duhet të theksohet se, ndryshe nga disa gjuhë të tjera programimi, karakteret pasuese të hapësirës së bardhë të Perl janë domethënëse kur krahasohen vargjet. Shembulli 4-9 tregon krahasimet e vargjeve që ilustrojnë rregullat e mësipërme.

"A" Ajo "a"; # Rezultati: i vërtetë (kodi "A" - \101, kodi "a" - \141)
"a" Ajo "aa";
# me kodin \000 që është më i vogël se kodi \141
# karakteri i dytë "a" i vargut të operandit të duhur)
"a" Ajo "a"; # Rezultati: e vërtetë (karakteri shtohet në vargun "a"
# me kodin \000 që është më i vogël se kodi \040
# hapësirë ​​pasuese e vargut të duhur të operandit)
"12" Ajo "9"; # Rezultati: i vërtetë (kodi "1" - \061, kodi "9" - \071)
"9" eq 09"; # Rezultati: false (kodi " " - \040, kodi "O" - \060)

Le t'i kushtojmë vëmendje dy operacioneve të fundit të krahasimit literal të vargut. Përmbajtja e operandëve të tyre mund të konvertohet në numrat e duhur, dhe kështu të njëjtat operacione të raportit numerik zbatohen për to. Megjithatë, rezultati i tyre do të jetë dukshëm i ndryshëm nga rezultati i kryerjes së operacioneve të vargut në lidhje. Kur përdorni operacionin< в предпоследнем выражении результат будет Ложь, а если в последнем выражении применить операцию ==, то результат будет Истина. Об этом всегда следует помнить, так как Perl автоматически преобразует символьные данные в числовые там, где это необходимо.

Kjo pjesë do të fokusohet në deklaratat e kushtëzuara dhe sythe.

Deklarata të kushtëzuara

Si gjithmonë, le të fillojmë menjëherë me shembuj.

$a = zhvendosje ;
nëse ($a > 10 ) (
printoni "a > 10 \n";
}

Programuesit në gjuhë të ngjashme me C-në duhet të jenë të njohur me dhimbje me këtë ndërtim, kështu që nuk ka shumë për të komentuar këtu. Më lejoni të them vetëm se, ndryshe nga në C, mbajtëset kaçurrelë nuk mund të hiqen këtu. Më saktësisht, ekziston një mënyrë, por më shumë për këtë më poshtë. Ndërtimet if-else dhe if-else-if-… në Perl duken kështu:

$a = zhvendosje ;
nëse ($a > 10 ) (
printoni "a > 10 \n";
) tjeter (
shtyp "a<= 10\n";
}

nëse ($a > 0 ) (
#bej dicka
) elif ($a == 0 ) (
#bej dicka
) tjeter (
#bëj diçka tjetër
}

Në përgjithësi, gjithçka është ashtu siç presim me një përjashtim. Nuk ka "tjetër nëse" në Perl - elsif duhet të përdoret në vend. Elsif mund të përsëritet disa herë, përndryshe është opsionale, mbajtëset kaçurrelë nuk mund të hiqen.

Ndryshe nga gjuhët e tjera të programimit, Perl gjithashtu ofron një deklaratë përveç nëse. Dy pjesët e mëposhtme të kodit bëjnë të njëjtën gjë:

përveç nëse ($a == 0 ) (
# "... përveç nëse a është zero"
...
}

nëse ($a != 0 ) (
# e njëjta
# ...
}

Përveç nëse mund të përdoret në kombinim me elsif dhe other, por nuk ka "elsunless" në Perl.

Perl ka aftësinë të zvogëlojë sasinë e kodit nëse vetëm një rresht kodi duhet të ekzekutohet nëse një kusht është i vërtetë. Shembujt e mëposhtëm bëjnë të njëjtën gjë:


nëse ($a > $b ) (
dalja1;
}


përveç nëse ($b == $c) (
dalja 2;
}

# nëse kushti është i vërtetë - përfundoni skriptin me kodin 1
dalje 1 nëse ($a > $b );
# nëse b == c, vazhdoni ekzekutimin e skriptit
dalja 2 përveç nëse ($b == $c) ;

Në këtë rast, kllapat në shembullin e fundit mund të hiqen:

# nëse kushti është i vërtetë - përfundoni skriptin me kodin 1
dilni 1 nëse $a > $b ;

Nëse jeni duke shkruar në Java/PHP ose në një gjuhë tjetër të ngjashme me C-në, ky ndërtim ka shumë të ngjarë të jetë i pazakontë për ju, por në praktikë është vërtet i përshtatshëm. Në rusisht, në fund të fundit, ne gjithashtu themi zakonisht "përfundo programin nëse ...", dhe jo "nëse ..., atëherë ...".

Ashtu si C/C++ dhe PHP, Perl ka operator tresh?:. Punon ngjashëm me konstruktin if-else, vetëm brenda shprehjeve:

nëse ($a > $b ) (
$a = $a / $b ;
) tjeter (
$a = $b / $a ;
}

# kod i ngjashëm duke përdorur operatorin "pikëpyetje".
# një rresht kodi në vend të pesë
$a = $a > $b ? $a / $b: $b / $a ;

Unë gjithashtu do të doja të them disa fjalë për operatorët e krahasimit. Operatorët e Krahasimit në gjuhën Perl ndahen në dy grupe - duke prodhuar një krahasim të numrave dhe një krahasim të vargjeve.

Siç e mbani mend, skalarët në Perl mund të interpretohen si vargje ose numra. Për shembull, numri 123 është më i madh se numri 45, por vargu "123" është më i vogël se vargu "45". Kjo është arsyeja pse u deshën disa grupe operatorësh krahasimi. Krahasimi i vargjeve në Perl bëhet në të njëjtën mënyrë si në gjuhët e tjera moderne të programimit, kështu që shpresoj të mos ketë pyetje këtu.

për, foreach, ndërsa/deri, bëj..ndërsa/deri sythe

Cikli for është i njohur për të gjithë programuesit:

# printoni vargun "0 1 2 3 4"
për ($i = 0; $i< 5 ; $i ++ ) {
printoni "$i";
}

Në kllapa të ndara me pikëpresje shkruhet:

  1. Kodi që duhet të ekzekutohet përpara fillimit të ciklit.
  2. Gjendja në provë para fillimit(dhe jo në fund, siç mendojnë shumë njerëz) për çdo përsëritje. Nëse është false, cikli përfundon.
  3. Kodi që duhet të ekzekutohet pas çdo përsëritjeje.

Ashtu si në rastin e deklaratave të kushtëzuara, mbajtëset kaçurrelë nuk mund të hiqen në sythe (ekziston gjithashtu një shënim i veçantë për këtë - shih më poshtë).

Cikli foreach duhet të jetë i njohur për programuesit PHP:

@arr = (0 , 1 , 2 , 3 , 4 );
# printoni vargun "0 1 2 3 4"
foreach $i (@arr ) (
printoni "$i";
}

Trupi i ciklit foreach ekzekutohet për çdo element të grupit të specifikuar në kllapa. Një tipar i rëndësishëm i foreach është në ndryshoren $i nuk është kopjuar elementi i grupit @arr, siç mendojnë shumë njerëz. Ndryshorja $i në trupin e ciklit është vetë elementi i grupit. Kështu, kodi i mëposhtëm rrit vlerën e secilit element në grupin @arr:

$i = 19880508 ;
foreach $i (@arr ) (
$i++;
}
# $i është ende 19880508

Ju gjithashtu mund të përdorni foreach për të punuar me hash:

%hash = (
aaa => 1,
bbb => 2,
) ;
# funksioni tastet kthen një grup që përmban të gjithë çelësat hash
foreach $k (çelësat %hash ) (
printoni "$k => $hash($k) \n";
}

Perl për lak secili ka një formë të shkurtër:

# nëse keni harruar se çfarë bën operatori qw,
# kthehuni te pjesa e parë e "Bazat e Programimit Perl"
për $i (qw/1 2 3/ ) (
printoni "$i";
}

Kjo është, në fakt, në vend të foreach, ju thjesht mund të shkruani për kudo. Perl nuk do ta ngatërrojë këtë me një lak të vërtetë for, sepse ky i fundit ka nevojë për pikëpresje e kështu me radhë.

ndërsa, unazat deri dhe do funksionojnë saktësisht njësoj si në C++ ose Pascal/Delphi:

# Nxjerr "1 2 3 4 5" në katër mënyra të ndryshme

$i = 0 ;
ndërsa ($i< 5 ) { # për sa kohë që $i është më pak se pesë
shtyp ++ $i . "";
}
shtyp" \n"; # linjë e re

$i = 0 ;
deri në ($i == 5 ) ( # derisa $i të jetë e barabartë me pesë
shtyp ++ $i . "";
}
shtyp" \n";

$i = 0 ;
bej(
shtyp ++ $i . "";
) ndërsa ($i< 5 ) ; # kontrolloni në fund të ciklit
shtyp" \n";

$i = 0 ;
bej(
shtyp ++ $i . "";
) deri në ($i == 5 ) ;
shtyp" \n";

Për analogji me deklaratat if dhe nëse, ekziston një formë e shkurtuar për të shkruar sythe:

$i = 0 ;
shtyp ++ $i . " " ndërsa ($i< 5 ) ;
shtyp" \n";

$i = 0 ;
shtyp ++ $i . " " deri në ($i == 5 ) ;
shtyp" \n";

printoni "$_" për (qw/1 2 3 4 5/ ); # ju gjithashtu mund të paraqisni (qw/1 2 3 4 5/);
shtyp" \n";

Vini re ciklin e fundit të përparimit. Kujtojmë se kjo është një stenografi për foreach, jo një cikli për, apo jo? Ky i fundit, meqë ra fjala, nuk ka një rekord të shkurtër. Pra, emri i ndryshores nuk u tregua këtu, me ndihmën e së cilës do t'i qasemi elementeve të grupit. Nuk mund të përdoret në stenografinë e parë. Në këtë rast, përdoret një variabël i veçantë - $_. Shembulli i mëposhtëm është gjithashtu mjaft funksional:

për (qw/1 2 3 4/ ) (
printoni "$_" ;
}

Nga rruga, mund të rishkruhet si më poshtë.

Dhe ne mësuam se si numrat dhe vargjet konvertohen me njëri-tjetrin gjatë fluturimit. Ne madje i hodhëm një sy shprehje e kushtëzuar nëse, por nuk kanë mësuar ende se si të krahasojnë dy shkallë. Rreth saj do të diskutohet në këtë pjesë.

Nëse kemi dy variabla $x dhe $y, a mund t'i krahasojmë ato? A janë 1, 1.0 dhe 1.00 të barabarta? Po "1.00"? Cila është më e madhe - "foo" apo "bar"?

Dy grupe operatorësh krahasimi

Perl ka dy grupe operatorësh krahasimi. Ashtu si me operatorët binarë të mbledhjes (+), lidhjes (.) dhe përsëritjes (x) që kemi studiuar tashmë, edhe këtu operatori përcakton se si sillen operandët dhe si krahasohen ato.

Këto dy grupe operatorësh janë:

Vlera e vargut numerik == eq është e barabartë!= ne nuk është e barabartë< lt меньше >GT më shumë<= le меньше или равно >= ge është më e madhe ose e barabartë me

Operatorët në të majtë krahasohen vlerat numerike, dhe në të djathtë (në kolonën e mesme) krahasoni vlerat bazuar në tabelën ASCII ose vendndodhjen aktuale.

Le të shohim disa shembuj:

përdorni strikte; përdorni paralajmërime; përdorni 5.010; nëse (12.0 == 12) (thoni "E VËRTETË"; ) tjetër (thoni "FALSE"; )

Në këtë rast më të thjeshtë, Perl do të printojë TRUE sepse operatori == krahason dy numra, kështu që Perl-it nuk i intereson nëse ato shkruhen si numra të plotë ose notues.

Në krahasimin tjetër, situata është pak më interesante.

"12.0" == 12

kjo shprehje është gjithashtu e vërtetë, sepse operatori == i Perl konverton një varg në një numër.

2 < 3 истинно, так как < сравнивает два числа. 2 lt 3 также истинно, ведь 2 находистя перед 3 в Tabela ASCII. 12 > 3 është padyshim e vërtetë. 12 gt 3 do të kthehet FALSE

Kjo mund të duket e habitshme për disa në shikim të parë, por nëse mendoni për këtë, Perl i krahason vargjet karakter pas karakteri. Pra, krahason "1" dhe "3", dhe meqenëse ato janë të ndryshme dhe "1" vjen përpara "3" në tabelën ASCII, Perl vendos në këtë pikë që vlera e vargut 12 është më e vogël se vlera e vargut 3.

Gjithmonë duhet të jeni të sigurt se po e krahasoni vlerën pikërisht ashtu siç dëshironi!

"foo" == "bar" do të jetë e vërtetë

Ai gjithashtu do të lëshojë një paralajmërim nëse paralajmërimet (!) janë aktivizuar duke përdorur paralajmërimet e përdorimit . Arsyeja për këtë është se ne po përdorim dy vargje si numra në krahasimin numerik ==. Siç u përmend në pjesën e mëparshme, Perl shikon një varg nga fundi i majtë dhe e konverton atë në numrin që gjen atje. Meqenëse të dy vargjet fillojnë me shkronja, ato do të konvertohen në 0. 0 == 0, kështu që shprehja është e vërtetë.

Ne anen tjeter:

"foo" eq "bar" është i rremë

Kështu që gjithmonë duhet të jeni të sigurt se po e krahasoni vlerën pikërisht ashtu siç dëshironi!

E njëjta gjë do të ndodhë kur krahasojmë

"foo" == "" do të jetë e vërtetë

"foo "eq"" do të jetë false

Rezultatet në këtë tabelë mund të jenë të dobishme:

12.0 == 12 E VËRTETË "12.0" == 12 E VËRTETË "12.0" barazimi 12 E rreme 2< 3 ИСТИНА 2 lt 3 ИСТИНА 12 >3 E VËRTETË 12 gt 3 E rreme! (vëmendje, mund të mos jetë e dukshme në shikim të parë) "foo" == "" E VËRTETË! (Prodhon një paralajmërim nëse përdoret pragma e "paralajmërimeve") "foo" eq "" FALSE "foo" == "bar" E VËRTETË! (Prodhon një paralajmërim nëse përdoret pragma "paralajmërime") "foo" eq "bar" FALSE

Dhe së fundi, një shembull ku mund të bini në grackën e marrjes së disa të dhënave nga përdoruesi, dhe të prerë me kujdes linjën e re në fund për të kontrolluar nëse vargu është bosh.

përdorni strikte; përdorni paralajmërime; përdorni 5.010; printoni "input: "; emri im $ = ; chomp $emri; nëse ($name == "") ( # gabim! përdorni eq këtu në vend të == ! thoni "E VËRTETË"; ) tjetër (thoni "FALSE"; )

Nëse e ekzekutojmë këtë skript dhe shkruajmë "abc", marrim një përgjigje të VËRTETË, sepse perl mendonte se "abc" ishte e njëjtë me një varg bosh.

Artikujt kryesorë të lidhur