Kako podesiti pametne telefone i računare. Informativni portal

Perl: izrazi i operacije. A2.3.4.18 Logički I, ILI i XOR

Izrazi u PERL, kao iu drugim programskim jezicima, oni su kombinacije varijabli, konstanti i operacija koje daju smislen rezultat. Ovaj rezultat može biti skalar, niz ili asocijativni niz.

Sve PERL operacije su podijeljene na:

I/O operacije opisane su u članku " Perl: deskriptori datoteka“, operacije sa regularni izrazi — "Perl: regularni izrazi", odjeljak "Operacije s regularnim izrazima".

Operacije poređenja

Operacije poređenja uporedi dva operanda i vrati 1 ili 0 u zavisnosti od rezultata ovog poređenja. PERL sadrži dva skupa operatora poređenja: za poređenje brojeva i za poređenje nizova. Operacije prve grupe prvo pretvaraju operande u brojeve, a zatim ih upoređuju. Operacije druge grupe pretvaraju operande u nizove i uspoređuju ih sa leksikografski poredak. Ako je specificirana direktiva use locale, tada se poređenje vremena izvodi prema lokalizaciji.

Poređenje brojevaPoređenje nizovaImeOpis
a< b a lt b Manje 1 ako je lijevi operand manji od desnog operanda.
a > b a gt b Više 1 ako je lijevi operand veći od desnog operanda.
a<= b a le b Ne više 1 ako je lijevi operand manji ili jednak desnom operandu.
a => b a ge b Ne manje 1 ako je lijevi operand veći ili jednak desnom operandu.
a == b a eq b Jednako 1 ako je lijevi operand jednak desnom operandu.
a != b a ne b Nije jednako 1 ako lijevi operand nije jednak desnom operandu.
a<=>b a cmp b Poređenje -1 ako je lijevi operand manji od desnog operanda; 0 ako su jednaki; 1 ako je lijevi operand veći od desnog operanda.

Sljedeći primjer

$a = 299;
$b = 30;
ako ($a< $b)
{
print "Broj $a je manji od broja $b\n";
}
ako ($a lt $b)
{
print "String $a je manji od niza $b\n";
}

će prikazati poruku: Red 299 je manji od reda 30.

Bulove operacije

PERL sadrži dva seta logičke operacije , koji su identični po svom rezultatu, ali imaju drugačiji prioritet. Imajte na umu da se rezultati operacija I i ILI razlikuju od onih prihvaćenih u drugim programskim jezicima.

Operatori i , ili , xor i not imaju najmanji prioritet od svih PERL operatora. Ovo im omogućava da se koriste na desnoj strani iskaza bez dodatnih zagrada, kao što je ovo:

Otvorite HANDLE, "file.dat" ili umrijete "Greška: $!\n";

Korištenje operacije || u ovom primjeru bi bile potrebne zagrade:

Otvori(HANDLE, "datoteka.dat") || die "Greška: $!\n";

Bitne operacije

Bitne operacije primijenjen na operande predstavljene kao binarni brojevi(tj. kao bitstrings) i vraćaju vrijednost koja ukazuje na rezultat operacije.

OperacijaImeOpis
a&b Bitwise AND Vraća 1 na svakoj poziciji bita ako su odgovarajuće pozicije oba operanda 1.
a | b Bitwise OR Vraća 1 na svakoj poziciji bita ako je odgovarajuća pozicija barem jednog operanda 1.
a^b Bitwise XOR Vraća 1 na svakoj poziciji bita ako je odgovarajuća pozicija tačno jednog operanda 1.
~a Bitwise NE unarna operacija. Invertuje svaki bitni položaj operanda.
a<< b Shift lijevo smjene binarno predstavljanje lijevom operandu lijevo prema broju bitova specificiranih drugim operandom.
a >> b Shift desno Pomiče binarni prikaz lijevog operanda udesno za broj bitova specificiranih drugim operandom.

Operacije pomaka primjenjuju se samo na numeričke operande, ali i na ostale bitne operacije primjenjuje se i na brojeve i na nizove. Ako je jedan od operanada bitne operacije broj, tada se oba operanda pretvaraju u cijele brojeve. Ako su oba operanda stringovi, onda se konvertuju u nizove iste dužine i operacija se izvodi na svakom bitu rezultujućih nizova. Ovo nam omogućava da primijenimo bitne operacije na operande bilo koje dužine. U ovoj operaciji | | i ^ dodaju kraći niz udesno sa nula bitova, a operacija & skraćuje duži niz da bi se uklopio u kraći niz. Možemo eksplicitno specificirati tip operacije koristeći navodnike za nizove ili 0+ za brojeve. primjeri:

Ispis 1.9 | 2; # 3 (pokretni operand skraćen na cijeli broj)
print 150 | "105"; # 255 (0x96 | 0x69 jednako 0xFF)
print "150" | "105"; # "155" (u ASCII)
$a = 150;
$b = "105";
ispis 0+$a | 0+$b; # numerički operandi
ispisati "$a" | "$b"; # string operanda

Aritmetičke kontrolne direktive utiču na izvršavanje bitnih operacija. Prema zadanim postavkama, cijeli brojevi se smatraju bez predznaka, tako da operacija desnog pomaka ispunjava bitove visokog reda rezultata nulama, a ~0 operacija vraća najveći pozitivni cijeli broj. Direktiva use integer uzrokuje da se cijeli brojevi tumače kao brojevi s predznakom. Stoga, u svom opsegu, operacija desnog pomaka ispunjava visoke bitove rezultata bitom predznaka broja, a ~0 operacija vraća broj -1.

Unarne operacije

unarni plus

unarni plus(+) vraća svoj operand. Jedina smislena upotreba ovog operatora je odvajanje imena funkcije od njenih argumenata u zagradama. Razmotrite ovaj primjer:

print(10 + 20) / 10;

Suprotno očekivanjima, ova izjava ispisuje 30 umjesto 3. To je zato što zagrade oko argumenata funkcije imaju najveći prioritet u PERL, tj. print (10 + 20) se izvršava prije dijeljenja sa 10. rezultat se postiže korištenjem unarnog plusa u ispred zagrada, što smanjuje njihov prioritet:

Ispis +(10 + 20) / 10;

unarni minus

unarni minus(-) obrće predznak numeričkog operanda. Ako je operand niz, onda se vraća sljedeći rezultat:

  • ako niz počinje znakom "+" ili "-", tada se kao rezultat ovaj znak zamjenjuje suprotnim;
  • u suprotnom, vraća se konkatenacija znaka "-" i originalnog niza.

Konkretno, konstrukcije -word i "-word" su ekvivalentne.

Kreirajte vezu

inkrement i dekrement

Operacije ++ i -- se nazivaju operacijama prirast i dekrement. Povećanje povećava vrijednost numeričke varijable za 1. Ako se koristi kao prefiks (++a), onda vraća vrijednost operanda nakon povećanja za 1. Ako se koristi kao postfiks (a++), tada vraća vrijednost operanda prije nego što ga poveća za 1. Ako je operand povećanja string varijabla koja odgovara uzorku /^**$/ , tada se string inkrementira znak po znak sa premotavanjem. primjeri:

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

Dekrement se primjenjuje samo na numeričke varijable i smanjuje vrijednost varijable za 1. Ako se koristi kao prefiks (--a), onda vraća vrijednost operanda nakon što je dekrementira za 1. Ako se koristi kao postfiks ( a--), zatim vraća vrijednost operand prije nego što je dekrementira za 1. Primjeri:

Ispis -($x = 99); #98
print (($x = 99)--); #99
print -($x = "a0"); # -jedan

Imenovane unarne operacije

Aditivne operacije

Postoje dva aditivne operacije preko brojeva (sabiranje i oduzimanje) i jedan preko nizova (konkatenacija).

Ispisati "1" + "2"; #3
ispisati "1". "2"; # "12"

Multiplikativne operacije

Ima ih četiri multiplikativne operacije preko brojeva (množenje, dijeljenje, modulo ostatak i stepenovanje) i jedan preko nizova (ponavljanje).

OperacijaImeOpis
a*b Množenje Vraća proizvod dva numerička operanda.
a/b divizija Vraća kvocijent dva numerička operanda.
a % b Modulo ostatak Vraća cjelobrojni ostatak nakon dijeljenja lijevog operanda desnim operandom. Plutajući brojevi se zaokružuju na cijele brojeve prije operacije. Ako je b negativan, tada je i rezultat negativan.
a**b Eksponencijacija Vraća a na stepen b.
a x b Ponavljanje Lijevi operand mora biti niz ili lista, desni operand mora biti broj. Vraća operand a ponovljen b puta.

Ispis "-" x 80; # ispisuje niz minusa
@jedinice = (1) x 5; # @one = (1, 1, 1, 1, 1)
@one = (2) x @one; # @one = (2, 2, 2, 2, 2)

Operacije dodjele

Operacije dodjele dodijeliti lijevom operandu rezultat operacije, koji je određen desnim operandom i samom operacijom. Osnovni operator dodjeljivanja je a = b, što znači: dodijeliti vrijednost operanda b varijabli a. Svi ostali operatori dodjeljivanja su skraćenica za druge operatore dodjele, kao što je prikazano u sljedećoj tabeli.

OperacijaZnačenje
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

Operator dodjeljivanja vraća svoj lijevi operand i stoga se može koristiti na lijevoj strani sljedećeg operatora dodjeljivanja. na primjer

($a += 2) *= 3;

ekvivalentno

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

Dodjeljivanje liste listi vraća listu varijabli kojima su dodijeljene vrijednosti. Dodjeljivanje liste skalaru vraća broj elemenata u toj listi.

q-operacije

U većini programskih jezika, navodnici se koriste za formiranje string konstanti. Međutim, u PERL-u to su operacije koje pružaju interpolaciju niza i podudaranje uzorka. Nazvat ćemo takve operacije q-operacije(od engleska riječ citat, tj. citat). PERL sadrži dva skupa q-operacija, navedenih u sljedećoj tabeli.

Citatiq-operacijaZnačenjeInterpolacija
"" q() Konstantno Ne
"" qq() Konstantno Da
`` qx() Tim Da (ako graničnici nisu "")
qw() Lista riječi Ne
qr() Regularni izraz Da (ako graničnici nisu "")
// m() Pattern matching Da (ako graničnici nisu "")
s()() Zamjena Da (ako graničnici nisu "")
tr()() Transliteracija Samo izlazne sekvence

Ovdje, umjesto zagrada (), možete koristiti bilo koji znak koji nije slovo, broj ili razmak, ili uparene graničnike: (), , (),<>. Dati su primjeri korištenja q-konstrukcija za kreiranje string konstanti tačka 6.2.3.2; Za njihovu upotrebu u regularnim izrazima, vidi tačka 6.4.6 .

Ostale operacije

Deaddressing

Operacija de-addressing izgleda kao:

Operacije vezivanja

Većina operacija nad regularnim izrazima radi sa posebnom varijablom $_. Za usklađivanje uzoraka proizvoljni nizovi se koriste operacije povezivanja, koji izgledaju kao:

A =~ ba !~ b

gdje je a bilo koji string izraz, a b obrazac za podudaranje, zamjenu ili transliteraciju. Operator =~ vraća true ako je podudaranje, zamjena ili transliteracija bila uspješna, i false u suprotnom. Operacija !~ vraća logičku negaciju rezultata =~. Za primjere kako koristiti ove operacije, pogledajte tačka 6.4.6 .

Podešavanje opsega

Operacija podešavanje opsega izgleda kao:

To su zapravo dvije različite operacije ovisno o kontekstu. U kontekstu liste, ova operacija vraća listu vrijednosti (a a+1 ... b). Za nizove, opseg se formira pomoću prirast, Na primjer:

Foreach(1..10)
{
# petlje 10 puta
}
@a = @a[$#a-4 .. $#a]; # seče poslednjih pet elemenata
@a = ("abc".."abe"); # @a = ("abc", "abd", "abe")

U skalarnom kontekstu, ova operacija se ponaša kao okidač koji ima dva stanja i vraća true ili false. Svaka od operacija.. pohranjuje svoje stanje. Netačan je sve dok je njegov lijevi operand lažan. Kada levi operand postane istinit, ova operacija je tačna sve dok je desni operand lažan. Nakon što desni operand postane istinit, ova operacija ponovo vraća false.

Rezultat ne postaje lažan do sljedećeg poziva ove operacije. Operacija.. može testirati pravi operand i postati lažan u isto vrijeme kada procijeni na istinito, ali jednom kada vrati true. Ako želimo da ne procjenjuje pravi operand do sljedećeg poziva, onda moramo koristiti obrazac

Inače, operacije .. i ... su identične. Desni operand se ne vrednuje dok je operacija lažna, a lijevi operand se ne vrednuje dok je operacija istinita. Vrijednost vraćena ovom operacijom je prazan red u lažnom stanju, a uzastopni cijeli brojevi koji počinju od 1 u istinitom stanju. Redni broj se resetuje za novi opseg. To zadnji broj rasponu, dodaje se niz "E0". Ako je bilo koji od operanada konstanta, onda se implicitno upoređuje sa posebnom varijablom $. (sadrži broj trenutna linija trenutni fajl). Otvara se sljedeći primjer dati fajl i ispisuje svoje redove od jednog do petog.

Otvorite HANDLE, "ime datoteke.ext";
dok ( )
{
print if (1..5);
}

Uslovni rad

Uslovni rad je ternarna operacija koja izgleda ovako:

testirati? vrijednost1: vrijednost2

gdje su test, vrijednost1 i vrijednost2 bilo koji izrazi. Ako je test istinit, tada operacija vraća vrijednost1, u suprotnom vraća vrijednost2. primjer:

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

Ovaj operator se može koristiti na lijevoj strani operatora dodjeljivanja ako su i vrijednost1 i vrijednost2 varijable, na primjer:

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

Operacija zarez

Operacija zarez uzrokuje sekvencijalnu evaluaciju vrijednosti dvaju izraza i vraća drugi od njih. Izgleda:

Izraz1, izraz2

gdje su expr1 i expr2 bilo koji izrazi. U listama, zarez služi kao separator između stavki liste.

PERL sadrži sinonim za ovu operaciju obrasca

izraz1 => izraz2

Ovaj oblik se obično koristi za uparene elemente liste, na primjer, kada se inicijaliziraju asocijativni nizovi. Takođe, ako je lijevi operand operatora => riječ, onda se tumači kao string (vidi dolje). tačka 6.2.7)

Redoslijed operacija

Prilikom evaluacije izraza, PERL uzima u obzir prioritet rada: Operacije sa višim prioritetom se izvode prve. Za promjenu redoslijeda operacija koristite zagrade: Izraz koji se nalazi u njima ima najveći prioritet. Sljedeća tabela navodi sve operatore jezika PERL u opadajućem redoslijedu njihovog prioriteta; operacije koje se nalaze u istom redu tabele imaju jednak prioritet i izvode se ili s lijeva na desno ili s desna na lijevo, kako je prikazano u tabeli.

OperacijaAsocijativnost
termini i liste lijevo
-> lijevo
++ -- br
** u pravu
! ~ \ + (unarno) - (jedno) u pravu
=~ !~ lijevo
* / % x lijevo
+ - . lijevo
<< >> lijevo
imenovane unarne operacije br
< > <= >= lt gt le ge br
== != <=>eq ne cmp br
& lijevo
| ^ lijevo
&& lijevo
|| lijevo
.. ... br
?: u pravu
= op= u pravu
, => lijevo
ne u pravu
i lijevo
ili xor lijevo

Postoji nekoliko načina za poređenje objekata u Perlu. Možete provjeriti jednakost vrijednosti pomoću infiks operatora ===. Za nepromjenjive objekte (čije vrijednosti se ne mogu promijeniti, literale. Na primjer, literal 7 će uvijek biti 7) ovo je obično poređenje vrijednosti. Na primjer, "hello"==="hello" je uvijek istinito jer su oba niza nepromjenjiva i imaju istu vrijednost.

Za promjenjive objekte, === uspoređuje njihov identitet. === vraća true ako su njegovi argumenti aliasi istog objekta. Ili su dva objekta identična ako su isti objekt. Čak i ako oba niza @a i @b sadrže iste vrijednosti, ako su njihovi kontejneri različiti objekti, oni će imati različite identitete i neće biti identični u poređenju sa === :

Moj @a = 1, 2, 3; moj @b = 1, 2, 3; reci @a === @a; #1 reci @a === @b; # 0 # ovdje korišteni identitet recimo 3 === 3; # 1 reci "a" === "a"; # 1 my $a = "a"; reci $a === "a"; #jedan

Operator eqv vraća True ako su dva objekta istog tipa i strukture. Dakle, za @a i @b u primjeru, @a eqv @b je istina jer @a i @b sadrže iste vrijednosti. S druge strane, "2" eqv 2 će vratiti False , budući da je argument na lijevoj strani niz, a na desnoj strani je broj, pa su stoga različitog tipa.

Baš kao što == pretvara svoje argumente u brojeve, eq infix operator upoređuje jednakost stringova, pretvarajući argumente u nizove ako je potrebno.

Ako $greeting eq "zdravo" ( recite "dobrodošli"; )

Drugi operatori upoređuju stringove leksikografski.

Zapravo pogodniji oblik za !== , koji je zauzvrat spoj meta operatora! i infiksni operator == . Isto objašnjenje vrijedi za ne i!eq.

Operatori trosmjernog poređenja uzimaju dva operanda i vraćaju Order::Povećaj ako je operand s lijeve strane manji, Order::Isto ako je jednak, Order::Smanji ako je operand na desnoj strani manji (Red::Povećaj , Order ::Isto i Red: :Smanjenje su nabrajanja; vidi). Za numerička poređenja koristite operator<=>, a za žice je leg (od engleskog l esser, e qual, g reater). Cmp infiksni operator je također operator poređenja koji vraća tri rezultata poređenja. Njegova posebnost je u tome što zavisi od vrste argumenata: upoređuje brojeve kao<=>, nizovi kao krak i (na primjer) parovi koji prvo upoređuju ključeve, a zatim vrijednosti (ako su ključevi jednaki).

Reci 10<=>5; # +1 recimo 10 nogu 5; # jer "1" lt "5" kažu "ab" nogu "a"; # +1, leksikografsko poređenje

Tipična primjena navedenih trosmjernih operatora poređenja je sortiranje. Metoda .sort na listama prima blok ili funkciju koja uspoređuje svoja dva argumenta i vraća negativne vrijednosti ako su manji od 0 ako su argumenti jednaki i veći od 0 ako je prvi argument veći od drugog. Ovi rezultati se zatim koriste u sortiranju za formiranje rezultata.

Reci ~ .sort; # izlaz: Konkretni apstraktni reci ~ .sort: -> $a, $b (uc($a) leg uc($b)); # izlaz: sažetak Beton

Zadano sortiranje je osjetljivo na velika i mala slova, tj. velika slova su "veća" od malih. Primjer koristi sortiranje bez obzira na velika i mala slova.

Različiti operatori poređenja navode svoje argumente na određene tipove prije nego što ih uporede. Ovo je korisno kada je potrebno specifično poređenje, ali su tipovi parametara nepoznati. Perl 6 pruža poseban operator koji omogućava poređenja "Uradite pravu stvar" koristeći ~~, "pametni" operator poređenja.

Ako $pints-pijan ~~ 8 ( recite "Idite kući, dosta vam je!"; ) ako $country ~~ "Švedska" ( recite "Kufte sa borovnicama i losom od krompira, molim." ) osim ako $group-size ~~ 2..4 ( recite "Morate imati između 2 i 4 osobe da rezervišete ovu turneju."; )

Operator pametnog podudaranja uvijek odlučuje koju vrstu poređenja će napraviti ovisno o vrsti vrijednosti na desnoj strani. U prethodnim primjerima, ova poređenja su bila numerička, nizova i rasponska poređenja. Ovo poglavlje je demonstriralo rad operatora poređenja: brojeva - == i nizova eq. Međutim, ne postoji operator za poređenje opsega. Ovo je dio moći "pametnog" uparivanja: složeniji tipovi vam omogućavaju da implementirate neobične ideje kombinovanjem poređenja s drugima.

Pametno uparivanje radi tako što poziva metodu ACCEPTS na desnom operandu i prosljeđuje mu lijevi operand kao argument. Izraz $answer ~~ 42 svodi se na pozivanje 42.ACCEPTS($answer) . Ove informacije će vam biti od koristi dok čitate naredna poglavlja o klasama i metodama. I vi pišete stvari koje mogu da urade "pametno" uparivanje implementacijom metode ACCEPTS kako bi ona "radila kako treba".

Za upoređivanje skalarnih podataka ili vrijednosti skalarnih varijabli, Perl pruža skup binarnih operacija koje izračunavaju jednake, veće od, veće ili jednake itd. relacije između svojih operanda, zbog čega se ova grupa operacija naziva i relacione operacije. Perl koristi različite operacije za upoređivanje numeričkih podataka i string podataka. Svi su prikazani u tabeli. 4.1.

Tabela 4.1. operacije odnosa

Operacija Numeric string Značenje
Jednakost == ekv Tačno ako su operandi jednaki, inače netačno
Nejednakost != ne Tačno ako operandi nisu jednaki, inače netačno
Manje < lt Tačno ako je lijevi operand manji od desnog, inače netačno
Više > gt Tačno ako je lijevi operand veći od desnog, inače netačno
Manje ili jednako <= le Tačno ako je lijevi operand veći ili jednak desnom, u suprotnom netačno
Više ili jednako >= ge Tačno ako je desni operand veći ili jednak lijevom, inače netačno
Poređenje <=> cmt 0 ako su operandi jednaki
1 ako je lijevi operand veći od desnog
-1 ako je desni operand veći od lijevog

Rezultat relacijskih operacija (osim posljednjeg poređenja) je Tačno, vrijednost 1, ili False, prazan niz "".

Komentar
Vrijednost true u aritmetičkim operacijama tumači se kao broj 1, a u string operacijama kao niz "1". Lažna vrijednost u aritmetičkim operacijama tumači se kao broj 0, a u string operacijama kao prazan niz " ".

Operacije numeričkog omjera

Numeričke relacijske operacije se primjenjuju na numeričke podatke, a jedan ili oba operanda se mogu dati nizom koji sadrži važeći decimalni broj. Ako je bilo koji od operanada u numeričkoj relacijskoj operaciji postavljen na niz čiji sadržaj ne predstavlja valjani decimalni broj, tada se njegova vrijednost postavlja na o i prikazuje se upozorenje o pogrešnoj upotrebi operanda u numeričkoj relacijskoj operaciji ( ako je omogućen način prikaza upozorenja Perl interpretera). Značenje relacionih operacija za numeričke podatke odgovara uobičajenim matematičkim operacijama poređenja brojeva (Primer 4.7).

123 > 89; # Rezultat: 1 (tačno)

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

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

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

23 >= 89; # Rezultat: "" (netačno)

23 <=>89; # Rezultat: -1 (desni operand veći od lijevog)

89 <=>23; # Rezultat: 1 (desni operand veći od lijevog)

Upotreba numeričkih operacija poređenja nije teška, međutim, kada se upoređuje radi jednakosti decimalnih brojeva s pomičnim zarezom, mogu se pojaviti efekti zaokruživanja, povezani s ograničenim brojem značajnih znamenki u mantisi predstavljanja realnih brojeva u računaru i koji dovode do " netačno", sa stanovišta korisnika, operacije poređenja . Primjer 4.8 ilustruje sličnu situaciju.

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

$zz = 10+0,7-10; # Varijabla $zz sadrži broj 0.7

# Odštampaj string "z je jednako zz" ako su $z i $zz jednaki ispiši "z je jednako zz\n" ako ($z == $zz);

Kada pokušamo da pokrenemo Primer 4.8, iznenađeni smo kada otkrijemo da naš program neće ništa ispisati. Sta je bilo? Odgovor leži u operatoru za izračunavanje vrijednosti varijable $zz. Prilikom izvođenja aritmetičkih operacija, greške zaokruživanja rezultiraju vrijednošću od 0,699999999999999 (možete umetnuti naredbu za ispis varijable $zz i vidjeti ovo), iako blizu 0,7, ali nije potpuno jednaka njoj. Stoga je operacija poređenja radila ispravno!

Savjet
Nemojte koristiti operaciju poređenja za jednakost realnih brojeva, njen rezultat možda neće odgovarati onome što se očekuje sa tačke gledišta matematike. Ako trebate provjeriti jednakost dva realna broja, onda je bolje usporediti apsolutnu vrijednost njihove razlike s nekim vrlo malim brojem (ovisno o traženoj tačnosti):

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

Operacije relacije nizova

Poređenje nizova podataka zasniva se na njihovom poretku prema tablici ASCII kodova, tj. znak sa nižim ASCII kodom prethodi znaku sa višim kodom. Stringovi se porede znak po karakter s lijeva na desno. To znači da ako su prvi znakovi nizova jednaki, onda se upoređuju drugi, a ako su jednaki, onda se upoređuju treći, itd. Štaviše, ako su nizovi različite dužine, tada nedostaje broj znakova za jednakost sa kodom o se dodaje na kraj kraćeg niza. Treba napomenuti da su, za razliku od nekih drugih programskih jezika, Perl-ovi završni razmaci značajni kada se porede stringovi. Primjer 4-9 pokazuje poređenja stringova koji ilustruju gornja pravila.

"A" To "a"; # Rezultat: tačno (šifra "A" - \101, kod "a" - \141)
"a" To "aa";
# sa kodom \000 koji je manji od koda \141
# drugi znak "a" niza desnog operanda)
"a" To "a"; # Rezultat: tačno (znak se dodaje nizu "a"
# sa kodom \000 koji je manji od koda \040
# razmak na kraju desnog niza operanda)
"12" To "9"; # Rezultat: tačno (šifra "1" - \061, kod "9" - \071)
"9" ekv 09"; # Rezultat: lažno (šifra " " - \040, kod "O" - \060)

Obratimo pažnju na posljednje dvije operacije poređenja literala niza. Sadržaj njihovih operanada može se pretvoriti u ispravne brojeve, pa se na njih primjenjuju iste operacije numeričkog odnosa. Međutim, njihov će se rezultat značajno razlikovati od rezultata izvođenja string operacija na relaciji. Kada koristite operaciju< в предпоследнем выражении результат будет Ложь, а если в последнем выражении применить операцию ==, то результат будет Истина. Об этом всегда следует помнить, так как Perl автоматически преобразует символьные данные в числовые там, где это необходимо.

Ovaj dio će se fokusirati na uslovne izjave i petlje.

Uslovne izjave

Kao i uvijek, počnimo odmah s primjerima.

$a = pomak;
ako ($a > 10 ) (
ispisati "a > 10 \n";
}

Programeri u jezicima sličnim C bi trebali biti do bolova upoznati s ovom konstrukcijom, tako da ovdje nema puno komentara. Dozvolite mi samo da kažem da, za razliku od C, vitičaste zagrade se ovdje ne mogu izostaviti. Tačnije, postoji način, ali o tome u nastavku. Konstrukcije if-else i if-else-if-… u Perlu izgledaju ovako:

$a = pomak;
ako ($a > 10 ) (
ispisati "a > 10 \n";
) drugo (
print "a<= 10\n";
}

ako ($a > 0 ) (
#radi nešto
) elsif ($a == 0 ) (
#radi nešto
) drugo (
# uradi nešto drugo
}

Generalno, sve je kako očekujemo sa jednim izuzetkom. U Perlu ne postoji "else if" - umjesto toga treba koristiti elsif. Elsif se može ponoviti više puta, inače nije obavezno, vitičaste zagrade se ne mogu izostaviti.

Za razliku od drugih programskih jezika, Perl takođe pruža naredbu unless. Sljedeća dva dijela koda rade istu stvar:

osim ako ($a == 0 ) (
# "... osim ako a nije nula"
...
}

ako ($a != 0 ) (
# isto
# ...
}

Osim ako se može koristiti u kombinaciji sa elsif i else, ali ne postoji "elsunless" u Perlu.

Perl ima mogućnost da smanji količinu koda ako samo jedan red koda treba da se izvrši ako je uslov istinit. Sljedeći primjeri rade istu stvar:


ako ($a > $b) (
izlaz1 ;
}


osim ako ($b == $c ) (
izlaz 2 ;
}

# ako je uslov tačan - prekinuti skriptu kodom 1
izlaz 1 ako ($a > $b) ;
# ako je b == c, nastavi izvršavanje skripte
izlaz 2 osim ako ($b == $c ) ;

U ovom slučaju, zagrade u posljednjem primjeru mogu biti izostavljene:

# ako je uslov tačan - prekinuti skriptu kodom 1
izlaz 1 ako je $a > $b;

Ako pišete u Java/PHP ili nekom drugom jeziku sličnom C, ova konstrukcija će vam najvjerovatnije biti neobična, ali u praksi je zaista zgodna. Na ruskom, uostalom, također obično kažemo „završi program ako ...”, a ne „ako ..., onda ...”.

Baš kao C/C++ i PHP, Perl ima ternarni operator?:. Radi slično kao i if-else konstrukcija, samo unutar izraza:

ako ($a > $b) (
$a = $a / $b;
) drugo (
$a = $b / $a;
}

# sličan kod koji koristi operator "znak pitanja".
# jedan red koda umjesto pet
$a = $a > $b ? $a / $b: $b / $a ;

Također bih želio reći nekoliko riječi o operatorima poređenja. Operatori poređenja u jeziku Perl se dijele u dvije grupe - proizvodeći poređenje brojeva i poređenje nizova.

Kao što se sećate, skalari u Perlu se mogu tumačiti ili kao nizovi ili kao brojevi. Na primjer, broj 123 je veći od broja 45, ali niz "123" je manji od niza "45". Zato je bilo potrebno nekoliko grupa operatora poređenja. Poređenje stringova u Perlu se radi na isti način kao iu drugim modernim programskim jezicima, tako da se nadam da ovdje nema pitanja.

for, foreach, while/until, do..while/until petlje

For petlja je dobro poznata svim programerima:

# ispis stringa "0 1 2 3 4"
za ($i = 0; $i< 5 ; $i ++ ) {
print "$i" ;
}

U zagradama odvojenim tačkom i zarezom piše:

  1. Kod koji treba izvršiti prije početka petlje.
  2. Stanje se testira prije početka(a ne na kraju, kako mnogi misle) svake iteracije. Ako je netačno, petlja se završava.
  3. Kod koji se izvršava nakon svake iteracije.

Kao iu slučaju uslovnih naredbi, vitičaste zagrade se ne mogu izostaviti u petljama (za ovo postoji i posebna notacija - vidi ispod).

Foreach petlja bi trebala biti poznata PHP programerima:

@arr = (0, 1, 2, 3, 4) ;
# ispis stringa "0 1 2 3 4"
foreach $i (@arr ) (
print "$i" ;
}

Tijelo foreach petlje se izvršava za svaki element niza naveden u zagradama. Važna karakteristika foreach-a je u varijabli $i nije kopirano element niza @arr, kako mnogi misle. Varijabla $i u tijelu petlje je sam element niza. Dakle, sljedeći kod povećava vrijednost svakog elementa u @arr nizu:

$i = 19880508 ;
foreach $i (@arr ) (
$i++;
}
# $i je još uvijek 19880508

Također možete koristiti foreach za rad sa hashovima:

%hash = (
aaa => 1 ,
bbb => 2 ,
) ;
# funkcija ključeva vraća niz koji sadrži sve hash ključeve
foreach $k (ključevi %hash) (
print "$k => $hash($k) \n";
}

Perl za petlju svaki ima kratku formu:

# ako ste zaboravili šta radi qw operator,
# vratite se na prvi dio "Osnove Perl programiranja"
za $i (qw/1 2 3/ ) (
print "$i" ;
}

To jest, u stvari, umjesto foreach, možete jednostavno pisati za svuda. Perl ovo neće pobrkati sa realnom for petljom, jer su ovoj petlji potrebne tačke i zarezi i tako dalje.

while, while i do petlje rade potpuno isto kao u C++ ili Pascal/Delphiju:

# izlaz "1 2 3 4 5" na četiri različita načina

$i = 0;
dok ($i< 5 ) { # sve dok je $i manji od pet
print ++ $i . "";
}
štampa" \n"; # novi red

$i = 0;
dok ($i == 5 ) ( # dok $i ne bude jednako pet
print ++ $i . "";
}
štampa" \n";

$i = 0;
uraditi(
print ++ $i . "";
) dok ($i< 5 ) ; # provjerite na kraju petlje
štampa" \n";

$i = 0;
uraditi(
print ++ $i . "";
) do ($i == 5 ) ;
štampa" \n";

Po analogiji sa if i unless izjavama, postoji skraćeni oblik za pisanje petlji:

$i = 0;
print ++ $i . " " dok ($i< 5 ) ;
štampa" \n";

$i = 0;
print ++ $i . " " do ($i == 5 ) ;
štampa" \n";

ispisati "$_ " za (qw/1 2 3 4 5/ ) ; # također možete foreach(qw/1 2 3 4 5/);
štampa" \n";

Obratite pažnju na poslednju foreach petlju. Sjećamo se da je ovo skraćenica za foreach, a ne za petlju, zar ne? Potonji, inače, nema kratku evidenciju. Dakle, ovdje nije naznačeno ime varijable, uz pomoć koje ćemo pristupiti elementima niza. Ne može se koristiti u foreach stenografiji. U ovom slučaju se koristi posebna varijabla - $_. Sljedeći primjer je također prilično funkcionalan:

za (qw/1 2 3 4/ ) (
print "$_" ;
}

Usput, može se prepisati na sljedeći način.

I naučili smo kako se brojevi i nizovi pretvaraju jedni u druge u hodu. Čak smo i pogledali uslovni izraz ako, ali još nisam naučio kako uporediti dva skalara. O tome će se raspravljati u ovom dijelu.

Ako imamo dvije varijable $x i $y, možemo li ih uporediti? Da li su 1, 1.0 i 1.00 jednaki? Šta je sa "1.00"? Što je veće - "foo" ili "bar"?

Dva seta operatora poređenja

Perl ima dva skupa operatora poređenja. Baš kao i kod binarnih operatora sabiranja (+), konkatenacije (.) i ponavljanja (x) koje smo već proučavali, i ovdje operator određuje kako se operandi ponašaju i kako se upoređuju.

Ova dva skupa operatora su:

Numerički niz vrijednost == eq je jednak!= ne nije jednak< lt меньше >GT više<= le меньше или равно >= ge je veće ili jednako

Operateri na lijevoj strani upoređuju numeričke vrijednosti, a na desnoj strani (u srednjem stupcu) usporedite vrijednosti na osnovu ASCII tablice ili trenutnog lokala.

Pogledajmo nekoliko primjera:

koristiti strict; koristiti upozorenja; upotreba 5.010; if (12.0 == 12) (recite "TRUE"; ) else (recite "FALSE"; )

U ovom najjednostavnijem slučaju, Perl će ispisati TRUE jer == operator upoređuje dva broja, tako da Perl ne brine da li su napisani kao cijeli brojevi ili kao float.

U sljedećem poređenju situacija je malo zanimljivija.

"12.0" == 12

ovaj izraz je također istinit, jer Perl-ov == operator pretvara string u broj.

2 < 3 истинно, так как < сравнивает два числа. 2 lt 3 также истинно, ведь 2 находистя перед 3 в ASCII tabela. 12 > 3 je očigledno tačno. 12 gt 3 će vratiti FALSE

Ovo može nekome izgledati iznenađujuće na prvi pogled, ali ako razmislite o tome, Perl uspoređuje nizove znak po znak. Dakle, poredi "1" i "3", a pošto su različiti i "1" dolazi ispred "3" u ASCII tabeli, Perl odlučuje u ovom trenutku da je vrednost niza 12 manja od vrednosti niza 3.

Uvijek morate biti sigurni da upoređujete vrijednost tačno onako kako želite!

"foo" == "bar" će biti istina

Također će izdati upozorenje ako su(!) upozorenja omogućena korištenjem upozorenja korištenja. Razlog za to je što koristimo dva niza kao brojeve u == numeričkom poređenju. Kao što je spomenuto u prethodnom dijelu, Perl gleda string s lijevog kraja i pretvara ga u broj koji tamo pronađe. Pošto oba niza počinju slovima, biće konvertovani u 0. 0 == 0, tako da je izraz tačan.

Na drugoj strani:

"foo" eq "bar" je netačan

Stoga uvijek morate biti sigurni da upoređujete vrijednost upravo onako kako želite!

Isto će se desiti i prilikom poređenja

"foo" == "" će biti istina

"foo "eq"" će biti lažno

Rezultati u ovoj tabeli mogu biti korisni:

12,0 == 12 TAČNO "12,0" == 12 TAČNO "12,0" eq 12 NETAČNO 2< 3 ИСТИНА 2 lt 3 ИСТИНА 12 >3 TAČNO 12 gt 3 NETAČNO! (pažnja, možda nije očigledno na prvi pogled) "foo" == "" TRUE! (Proizvodi upozorenje ako se koristi pragma "warnings") "foo" eq "" FALSE "foo" == "bar" TRUE! (Proizvodi upozorenje ako se koristi pragma "warnings") "foo" eq "bar" FALSE

I na kraju, primjer u kojem možete upasti u zamku primanja nekog unosa od korisnika i pažljivog odsijecanja novog reda na kraju kako biste provjerili je li niz prazan.

koristiti strict; koristiti upozorenja; upotreba 5.010; print "input: "; moje $name = ; chomp $name; if ($name == "") ( # pogrešno! ovdje koristite eq umjesto == ! recite "TRUE"; ) else ( recite "FALSE"; )

Ako pokrenemo ovu skriptu i upišemo "abc", dobićemo TRUE odgovor, jer je perl mislio da je "abc" isto što i prazan string.

Top Related Articles