Kako postaviti pametne telefone i računala. Informativni portal

Perl: izrazi i operacije. A2.3.4.18 Logički AND, OR i Exclusive OR

Izrazi u PERL-u, kao iu drugim programskim jezicima, to su kombinacije varijabli, konstanti i operacija koje daju smislene rezultate. Ovaj rezultat može biti skalarni, niz ili asocijativni niz.

Sve PERL operacije podijeljene su na:

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

Operacije usporedbe

Operacije usporedbe usporedite dva operanda i vratite 1 ili 0 ovisno o rezultatu te usporedbe. PERL sadrži dva skupa operatora za usporedbu: za usporedbu brojeva i za usporedbu nizova. Operacije prve grupe prvo pretvaraju operande u brojeve, a zatim ih uspoređuju. Operacije druge grupe pretvaraju operande u nizove i uspoređuju ih leksikografski poredak... Ako je specificirana direktiva use locale, tada se usporedba vrši na temelju locale.

Uspoređivanje brojevaUsporedite žiceImeOpis
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 Nije 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 jednadžba b Jednako 1 ako je lijevi operand jednak desnom operandu.
a! = b a ne b Nejednak 1 ako lijevi operand nije jednak desnom operandu.
a<=>b a cmp b Usporedba -1 ako je lijevi operand manji od desnog; 0 ako su jednaki; 1 ako je lijevi operand veći od desnog.

Sljedeći primjer

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

ispisat će poruku: Redak 299 manji je od retka 30.

Logičke operacije

PERL sadrži dva skupa logičke operacije , koji su identični po svom rezultatu, ali imaju različit prioritet. Imajte na umu da se rezultati operacija AND i OR razlikuju od rezultata drugih programskih jezika.

Operacije and, ili, xor i not imaju najniži prioritet među svim PERL operacijama. To im omogućuje da se koriste na desnoj strani iskaza bez dodatnih zagrada, na primjer:

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

Korištenje operacije || u ovom primjeru će biti potrebne zagrade:

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

Bitne operacije

Bitne operacije primjenjuju se na operande predstavljene kao binarni brojevi(tj. kao nizovi bitova) i vraćaju vrijednost koja ukazuje na rezultat operacije.

OperacijaImeOpis
a i b Bitno I Vraća 1 na svakoj poziciji bita ako su odgovarajuće pozicije oba operanda 1.
a | b Bitno ILI Vraća 1 na svakoj poziciji bita ako je odgovarajući položaj barem jednog operanda 1.
a ^ b Bitni XOR Vraća 1 na svakoj poziciji bita ako je odgovarajući položaj točno jednog operanda 1.
~ a Bitno NE Unarna operacija. Invertira svaki položaj bita operanda.
a<< b Lijeva smjena Smjene binarni prikaz lijevi operand lijevo prema broju bitova specificiranih drugim operandom.
a >> b Pomak udesno 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 primijeniti 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 nizovi, tada se pretvaraju u nizove iste duljine i operacija se izvodi na svakom bitu rezultirajućih nizova. To nam omogućuje primjenu bitnih operacija na operande bilo koje duljine. U ovom slučaju, operacija | i ^ nadopuni kraći niz s desne strane nula bitova, a operacija & skraćuje duži niz na veličinu kraćeg. Možemo eksplicitno naznačiti vrstu operacije koristeći navodnike za nizove ili 0+ za brojeve. primjeri:

Ispis 1.9 | 2; # 3 (plutajući operand sveden na cijeli broj)
ispis 150 | "105"; # 255 (0x96 | 0x69 jednako 0xFF)
ispis "150" | "105"; # "155" (u ASCII)
$ a = 150;
$ b = "105";
ispiši 0 + $ a | 0 + $ b; #numerički operandi
ispiši "$ a" | "$ b"; # operanda niza

Na bitne operacije utječu direktive aritmetičke kontrole. Prema zadanim postavkama, cijeli se brojevi smatraju bez predznaka, tako da operacija pomaka udesno ispunjava najznačajnije bitove rezultata nulama, a operacija ~ 0 vraća najveći pozitivni cijeli broj. Direktiva use integer uzrokuje da se cijeli brojevi tumače kao brojevi s predznakom. Stoga, u svom području djelovanja, operacija desnog pomaka ispunjava najznačajnije bitove rezultata bitom predznaka broja, a operacija ~ 0 vraća broj -1.

Unarne operacije

Unarni plus

Unarni plus(+) vraća svoj operand. Jedina smislena upotreba ove operacije je odvajanje naziva funkcije od njenih argumenata u zagradama. Razmotrimo ovaj primjer:

Ispis (10 + 20) / 10;

Suprotno očekivanjima, ovaj operator ne ispisuje broj 3, već broj 30. Činjenica je da zagrade oko argumenata funkcije imaju najveći prioritet u PERL-u, odnosno da se operacija ispisa (10 + 20) izvodi prije dijeljenje s 10. Željeni rezultat postiže se korištenjem unarnog plusa ispred zagrada, čime se smanjuje njihov prioritet:

Ispis + (10 + 20) / 10;

Unarni minus

Unarni minus(-) mijenja predznak numeričkog operanda. Ako je operand niz, tada se vraća sljedeći rezultat:

  • ako niz počinje znakom "+" ili "-", tada se ovaj znak kao rezultat zamjenjuje suprotnim znakom;
  • inače, vraća se spajanje znaka "-" i izvornog niza.

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

Kreiranje veze

Povećanje i smanjenje

Operacije ++ i - nazivaju se 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 je poveća za 1. Ako je operand inkrementa varijabla niza koja odgovara uzorku / ^ ** $ /, tada se niz povećava znak po znak, s prijelomom. primjeri:

Ispis ++ ($ x = "99"); # "jedna stotina"
ispis ++ ($ x = "a0"); # "a1"
ispis ++ ($ x = "Az"); # "Ba"
ispis ++ ($ x = "zz"); # "aaa"

Dekrement se primjenjuje samo na numeričke varijable i smanjuje vrijednost varijable za 1. Ako se ova operacija koristi kao prefiks (--a), tada vraća vrijednost operanda nakon što je smanji za 1. Ako se koristi kao postfix (a--), tada vraća operand vrijednosti prije nego što ga smanji za 1. Primjeri:

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

Imenovane unarne operacije

Aditivne operacije

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

Ispišite "1" + "2"; # 3
ispisati "1". "2"; # "12"

Multiplikativne operacije

Postoje četiri multiplikativne operacije preko brojeva (množenje, dijeljenje, modul i stepenovanje) i jedan preko nizova (ponavljanje).

OperacijaImeOpis
a * b Množenje Vraća umnožak dvaju numeričkih operanda.
a / b Podjela Vraća kvocijent dvaju numeričkih operanda.
a% b Ostatak po modulu Vraća cjelobrojni ostatak nakon dijeljenja lijevog operanda desnim. Plutajući brojevi se zaokružuju na cijele brojeve prije operacije. Ako je b negativan, tada je i rezultat negativan.
a ** b Eksponencijaliranje Vraća a na b stepen.
a x b Ponavljanje Lijevi operand mora biti niz ili popis, desni operand broj. Vraća operand a ponovljen b puta.

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

Operacije dodjele

Operacije dodjele lijevom operandu dodijeliti rezultat operacije, koji je određen desnim operandom i samom operacijom. Osnovna operacija dodjele je a = b, što znači: dodijeliti vrijednost operanda b varijabli a. Svi ostali zadaci su skraćenica za druge prekrivene zadatke, kao što je prikazano u sljedećoj tablici.

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 popisa popisu vraća popis varijabli kojima su dodijeljene vrijednosti. Dodjeljivanje popisa skalaru vraća broj elemenata na ovom popisu.

q-operacije

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

Citatiq-operacijaZnačenjeInterpolacija
"" q () Konstantno Ne
"" qq () Konstantno Da
`` qx () Tim Da (osim ako su graničnici "")
qw () Lista riječi Ne
qr () Regularni izraz Da (osim ako su graničnici "")
// m () Usklađivanje uzoraka Da (osim ako su graničnici "")
s () () Zamjena Da (osim ako su graničnici "")
tr () () Transliteracija Samo bijeg sekvence

Ovdje, umjesto zagrada (), možete koristiti bilo koji znak koji nije slovo, broj ili razmak, ili upareni graničnici: (),, (),<>... Navedeni su primjeri korištenja q-konstrukcija za stvaranje string konstanti p. 6.2.3.2; za njihovu upotrebu u regularnim izrazima, vidi p. 6.4.6 .

Ostale operacije

Preusmjeravanje

Operacija preusmjeravanje izgleda kao:

Operacije povezivanja

Većina operacija regularnog izraza radi s posebnom varijablom $ _. Za usklađivanje uzoraka proizvoljnih linija su korišteni operacije povezivanja koji izgledaju kao:

A = ~ ba! ~ B

gdje je a bilo koji izraz niza, a b uzorak za uparivanje, zamjenu ili transliteraciju. Operacija = ~ vraća true ako je podudaranje, zamjena ili transliteracija bila uspješna, a u suprotnom false. Operacija! ~ vraća logičku negaciju rezultata = ~. Za primjere korištenja ovih operacija, pogledajte p. 6.4.6 .

Postavka raspona

Operacija podešavanje raspona izgleda kao:

To su zapravo dvije različite operacije ovisno o kontekstu. U kontekstu popisa, ova operacija vraća popis vrijednosti (a a + 1… b). Za nizove, raspon se prikazuje pomoću prirast, Na primjer:

Foreach (1..10)
{
# petlja 10 puta
}
@a = @a [$ # a-4 .. $ # a]; # izrežite zadnjih pet elemenata
@a = ("abc" .. "abe"); # @a = ("abc", "abd", "abe")

U skalarnom kontekstu, ova se operacija ponaša kao okidač s dva stanja koji vraća true ili false. Svaka od .. operacija održava svoje stanje. Netočan je sve dok mu je lijevi operand lažan. Jednom kada je lijevi operand istinit, ova je operacija istinita sve dok je desni operand netočan. Nakon što desni operand postane istinit, ova operacija ponovno vraća laž.

Rezultat ne postaje lažan do sljedećeg poziva ove operacije. Operacija .. može provjeriti desni operand i postati lažna za istu evaluaciju, kada postane istinita, ali jednom će vratiti true. Ako želimo da ne evaluira 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 redak false i uzastopni cijeli brojevi koji počinju od 1 true. Redni broj se resetira za novi raspon. DO posljednji broj rasponu se dodaje niz "E0". Ako je bilo koji od operanada konstantan, tada se implicitno uspoređuje s posebnom varijablom $. (sadrži broj trenutna linija trenutnu datoteku). Otvara se sljedeći primjer datu datoteku i ispisuje redove od jedan do pet.

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

Uvjetni rad

Uvjetni rad To je ternarna operacija koja izgleda ovako:

Test? vrijednost1: vrijednost2

gdje su test, vrijednost1 i vrijednost2 bilo koji izrazi. Ako je test istinit, tada operacija vraća vrijednost1, inače vraća vrijednost2. Primjer:

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

Ova se operacija može koristiti na lijevoj strani operacije dodjeljivanja ako su i vrijednost1 i vrijednost2 varijable, na primjer:

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

Operacija zarez

Operacija zarez uzrokuje da se vrijednosti dvaju izraza procjenjuju uzastopno i vraća drugi od njih. Izgleda kao:

Izraz 1, izraz 2

gdje su expr1 i expr2 bilo koji izrazi. U popisima, zarez služi kao razdjelnik za stavke popisa.

PERL sadrži sinonim za ovu operaciju obrasca

Izraz1 => izraz2

Ovaj se oblik obično koristi za uparene elemente popisa, na primjer, kada se inicijaliziraju asocijativni nizovi. Osim toga, ako je lijevi operand operatora => riječ, onda se tumači kao niz (vidi. p. 6.2.7)

Redoslijed operacija

Prilikom evaluacije izraza PERL uzima u obzir prioritet operacija: Najprije se izvode operacije s višim prioritetom. Za promjenu redoslijeda operacija koristite zagrade: izraz koji se nalazi u njima ima najveći prioritet. Sljedeća tablica navodi sve PERL operacije silaznim redoslijedom prioriteta; operacije koje se nalaze u istom retku tablice imaju jednak prioritet i izvode se s lijeva na desno ili s desna na lijevo, kako je naznačeno u tablici.

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

Postoji nekoliko načina za usporedbu objekata u Perlu. Možete provjeriti jednakost vrijednosti pomoću infiksnog operatora ===. Za nepromjenjive objekte (čije vrijednosti se ne mogu mijenjati, literale. Na primjer, literal 7 uvijek će biti 7) ovo uobičajena usporedba vrijednosti. Na primjer, "zdravo" === "zdravo" je uvijek istinito jer su oba niza nepromijenjena i imaju isto značenje.

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

Moj @a = 1, 2, 3; moj @b = 1, 2, 3; reci @a === @a; # 1 reci @a === @b; # 0 # ovdje koristi 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 istinit jer @a i @b sadrže iste vrijednosti. S druge strane, "2" eqv 2 će vratiti False, budući da je argument s lijeve strane niz, a argument s desne strane je broj, pa su stoga različitih tipova.

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

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

Drugi operatori uspoređuju nizove leksikografski.

Zapravo prikladniji oblik za! ==, koji je pak spoj! a infiksni operator ==. Isto objašnjenje vrijedi za ne i!

Operatori trosmjerne usporedbe primaju dva operanda i vraćaju Red :: Povećaj ako je operand manji s lijeve strane, Red :: Isti ako su jednaki, Red :: Smanji ako je operand s desne strane manji (Red :: Povećaj, Red :: Isto i Red: : Smanjenje su nabrajanja; vidi). Za numeričke usporedbe koristite operator<=>, a za žice je leg (od engleskog l esser, e qual, g reater). Infiksni operator cmp također je operator usporedbe koji vraća tri rezultata usporedbe. Njegova je posebnost u tome što ovisi o vrsti argumenata: brojevi se uspoređuju kao<=>, nizovi poput nogu i (na primjer) parova uspoređujući prvo 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, leksikografska usporedba

Razvrstavanje je tipična primjena spomenutih trosmjernih operatora usporedbe. Metoda sortiranja 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. Ti se rezultati zatim koriste u sortiranju za formiranje rezultata.

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

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

Različiti operatori usporedbe navode svoje argumente na određene tipove prije nego što ih uspoređuju. Ovo je korisno kada je potrebna posebna usporedba, ali vrste parametara nisu poznate. Perl 6 pruža poseban operator koji omogućuje usporedbe Do The Right Thing koristeći ~~ operator pametne usporedbe.

Ako $ pints-pijani ~~ 8 (recite "Idite kući, dosta vam je!";) Ako $ country ~~" Švedska "(recite" Mesne okruglice s jagodama i losom od krumpira, molim. ") Osim ako $ grupa veličine. ~~ 2..4 (recite "Morate imati između 2 i 4 osobe da rezervirate ovu turneju.";)

Operator pametnog podudaranja uvijek odlučuje kakvu će usporedbu izvesti na temelju vrste vrijednosti na desnoj strani. U prethodnim primjerima te su usporedbe bile numeričke usporedbe, usporedbe nizova i raspona. Ovo poglavlje demonstrira rad operatora za usporedbu: brojeva - == i nizova eq. Međutim, ne postoji operator za usporedbu raspona. Ovo je dio značajke "pametnog" podudaranja: složeniji tipovi omogućuju realizaciju neobičnih ideja kombiniranjem usporedbi s drugima.

Pametno uparivanje radi tako što poziva metodu ACCEPTS na desnom operandu i prosljeđuje operand s lijeve strane kao argument. Izraz $ answer ~~ 42 svodi se na pozivanje 42.ACCEPTS ($ odgovor). Ove informacije će vam dobro doći dok čitate kasnija poglavlja o klasama i metodama. I vi ćete napisati stvari koje mogu napraviti pametno mapiranje implementacijom metode ACCEPTS kako bi ona "radila kako treba".

Za usporedbu skalarnih podataka ili vrijednosti skalarnih varijabli, Perl nudi skup binarnih operacija koje izračunavaju relacije jednakosti, veće od, veće ili jednako, itd. između njihovih operanda, stoga se ova grupa operacija naziva i operacijama relacija . Perl koristi različite operacije za usporedbu numeričkih podataka i podataka niza. Svi su prikazani u tablici. 4.1.

Tablica 4.1. Operacije veza

Operacija Numerički Niz Značenje
Jednakost == ekv True ako su operandi jednaki, false u suprotnom
Nejednakost != ne True ako operandi nisu jednaki, false u suprotnom
Manje < lt True ako je lijevi operand manji od desnog operanda, false u suprotnom
Više > gt True ako je lijevi operand veći od desnog operanda, false u suprotnom
Manje ili jednako <= le True ako je lijevi operand veći ili jednak desnom operandu, u suprotnom false
Više ili jednako >= ge True ako je desni operand veći ili jednak lijevom operandu, u suprotnom false
Usporedba <=> 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 posljednje usporedbe) je True, vrijednost 1, ili False, prazan niz "".

Komentar
Prava vrijednost u aritmetičkim operacijama tumači se kao broj 1, a u string operacijama kao niz "1". Vrijednost false u aritmetičkim operacijama tumači se kao broj 0, a u nizovima kao prazan niz "".

Operacije numeričkih odnosa

Numeričke relacijske operacije primjenjuju se na numeričke podatke, gdje se jedan ili oba operanda mogu navesti kao niz koji sadrži valjani decimalni broj. Ako je u numeričkim relacijskim operacijama bilo koji od operanada naveden kao niz čiji sadržaj ne predstavlja valjani decimalni broj, tada se pretpostavlja da je njegova vrijednost jednaka i prikazuje se upozorenje o pogrešnoj upotrebi operanda u numeričkom relacijskom operatoru (ako je omogućen način prikaza upozorenja Perl interpretera). Značenje relacijskih operacija za numeričke podatke odgovara uobičajenim matematičkim operacijama za uspoređivanje brojeva (primjer 4.7).

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

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

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

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

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

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

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

Upotreba numeričkih operacija usporedbe nije teška, međutim, kada se uspoređuje radi jednakosti decimalnih brojeva s pomičnim zarezom, efekti zaokruživanja mogu se pojaviti povezani s ograničenim brojem značajnih znamenki u mantisi predstavljanja realnih brojeva u računalu i dovesti do "netočnog ", s korisničke točke gledišta, operacija usporedbe ... Primjer 4.8 ilustrira sličnu situaciju.

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

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

# Ispiši niz "z je jednako zz" ako su vrijednosti $z i $zz jednake ispiši "z je jednako zz \n" ako ($ z == $ zz);

Kada pokušamo pokrenuti Primjer 4.8, iznenađeni smo otkrivši da naš program neće ništa ispisati. Što je bilo? Odgovor leži u operatoru za izračunavanje vrijednosti varijable $ zz. Prilikom izvođenja aritmetičkih operacija, kao rezultat pogrešaka zaokruživanja, dobiva se vrijednost 0,699999999999999 (možete umetnuti iskaz za ispis za varijablu $ zz i u to se uvjeriti), iako je blizu 0,7, ali nije baš jednaka. Stoga je operacija usporedbe radila ispravno!

Savjet
Nemojte koristiti operaciju usporedbe za jednakost realnih brojeva, njen rezultat možda neće biti ono što se očekuje s matematičke točke gledišta. Ako je potrebno provjeriti jednakost dvaju realnih brojeva, onda je bolje usporediti apsolutnu vrijednost njihove razlike s nekim vrlo malim brojem (ovisno o traženoj preciznosti):

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

Operacije niza odnosa

Usporedba podataka niza temelji se na njihovom redoslijedu prema ASCII tablici, odnosno znak s nižim ASCII kodom prethodi znaku s višim kodom. Usporedba nizova vrši se znak po znak s lijeva na desno. To znači da ako su prvi znakovi nizova jednaki, onda se uspoređuju drugi, a ako su jednaki, onda se uspoređuju treći, itd. Štoviše, ako su nizovi različite duljine, tada se broj znakova s kodom o koji nedostaje za jednakost dodaje se na kraj kraćeg niza. Valja napomenuti da je, za razliku od nekih drugih programskih jezika, razmak Perl koji završava stringovima značajan kada se uspoređuje nizove. Primjer 4.9 prikazuje usporedbe nizova kako bi se ilustrirala ova pravila.

"A" To "a"; # Rezultat: istina (šifra "A" - \ 101, kod "a" - \ 141)
"a" To "aa";
# s kodom \ 000, što je manje od koda \ 141
# drugog znaka "a" niza desnog operanda)
"a" To "a"; # Rezultat: istina (znak se dodaje nizu "a"
# s kodom \ 000, što je manje od koda \ 040
# završni razmak niza desnog operanda)
"12" To "9"; # Rezultat: istina (šifra "1" - \ 061, kod "9" - \ 071)
"9" ekv 09"; # Rezultat: lažno (šifra "" - \ 040, kod "O" - \ 060)

Obratimo pozornost na posljednje dvije operacije za usporedbu string literala. Sadržaj njihovih operanada može se pretvoriti u važeće brojeve, pa su stoga slične numeričke relacijske operacije primjenjive na njih. Međutim, njihov će se rezultat značajno razlikovati od rezultata izvođenja operacija odnosa nizova. Prilikom korištenja operacije< в предпоследнем выражении результат будет Ложь, а если в последнем выражении применить операцию ==, то результат будет Истина. Об этом всегда следует помнить, так как Perl автоматически преобразует символьные данные в числовые там, где это необходимо.

U ovom dijelu ćemo govoriti o uvjetnim izjavama i petljama.

Uvjetni operatori

Kao i uvijek, krenimo odmah s primjerima.

$ a = pomak;
ako ($ a> 10) (
ispiši "a> 10 \ n ";
}

Programeri u jezicima sličnim C bi trebali biti bolno upoznati s ovom konstrukcijom, tako da nema što posebno komentirati. Dopustite mi samo da kažem da, za razliku od C, ovdje ne možete izostaviti vitičaste zagrade. Točnije, postoji način, ali više o tome u nastavku. Konstrukcije if-else i if-else-if-… u Perlu izgledaju ovako:

$ a = pomak;
ako ($ a> 10) (
ispiši "a> 10 \ n ";
) drugo (
ispis "a<= 10\ n ";
}

ako ($ a> 0) (
# učini nešto
) elsif ($ a == 0) (
# učini nešto
) drugo (
# učini nešto drugo
}

Općenito, sve je kako očekujemo s jednom iznimkom. U Perlu ne postoji "else if" - trebali biste koristiti elsif i samo to umjesto toga. Elsif se može ponoviti nekoliko puta, inače nije obavezno, vitičaste zagrade se ne mogu izostaviti.

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

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

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

Osim ako se može koristiti zajedno s elsif i ostalo, ali ne postoji "elsunless" u Perlu.

Perl ima mogućnost smanjiti količinu koda ako, ako je uvjet ispunjen, treba izvršiti samo jedan redak koda. Sljedeći primjeri rade istu stvar:


ako ($ a> $ b) (
izlaz 1;
}


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

# ako je uvjet istinit, prekinuti skriptu kodom 1
izlaz 1 ako ($ a> $ b);
# ako je b == c, nastavi s izvođenjem skripte
izlaz 2 osim ako ($ b == $ c);

U ovom slučaju, zagrade u posljednjem primjeru mogu se izostaviti:

# ako je uvjet istinit, prekinuti skriptu kodom 1
izlaz 1 ako $ a> $ b;

Ako pišete u Javi / PHP-u ili nekom drugom jeziku sličnom C, ova konstrukcija će vam najvjerojatnije biti neobična, ali u praksi je stvarno zgodna. Na ruskom također obično kažemo "dovrš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 pomoću operatora upitnika
# jedan redak koda umjesto pet
$ a = $ a> $ b? $ a / $ b: $ b / $ a;

Također bih želio reći nekoliko riječi o operatorima za usporedbu. Operatori za usporedbu u jeziku Perl dijele se u dvije grupe - uspoređivanje brojeva i uspoređivanje nizova.

Zapamtite, skalari u Perlu mogu se tumačiti ili kao nizovi ili kao brojevi. Na primjer, 123 je veći od 45, ali niz "123" je manji od niza "45". Ovdje je bilo potrebno nekoliko grupa operatora usporedbe. Perlova usporedba stringova radi se na isti način kao i u drugim modernim programskim jezicima, pa se nadam da nema pitanja.

Za, foreach, while / do, do..while / do petlje

Petlja for je vrlo poznata svim programerima:

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

U zagradama, točkom i zarezom odvojeno:

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

Kao iu slučaju uvjetnih operatora, ne možete izostaviti vitičaste zagrade u petljama (za to postoji i posebna oznaka - vidi dolje).

Petlja foreach trebala bi biti poznata PHP programerima:

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

Tijelo foreach petlje se izvršava za svaku stavku u nizu navedenom u zagradama. Važna značajka foreach je u varijabli $ i nije kopirano element @arr niza kao što mnogi ljudi misle. Varijabla $ i u tijelu petlje je sam element niza... Dakle, sljedeći kod povećava vrijednost svakog elementa polja @arr za jedan:

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

Foreach se također može koristiti za rad s hashevima:

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

U Perlu za petlju svaki ima kratki oblik:

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

To jest, zapravo, posvuda, umjesto foreach, možete jednostavno pisati za. Perl neće pobrkati takvu oznaku s realnom for petljom, jer u potonjoj trebate pisati točku-zarez i tako dalje.

Dok, do i do petlje rade na isti način kao u C ++ ili Pascal / Delphi:

# ispišite "1 2 3 4 5" na četiri različita načina

$ i = 0;
dok ($ i< 5 ) { # dok je $ i manje od pet
ispis ++ $ i. "";
}
ispis " \ n "; # nova linija

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

$ i = 0;
čini (
ispis ++ $ i. "";
) dok ($ i< 5 ) ; # provjerite na kraju petlje
ispis " \ n ";

$ i = 0;
čini (
ispis ++ $ i. "";
) do ($ i == 5);
ispis " \ n ";

Slično if i unless izjavama, postoji skraćenica za petlje:

$ i = 0;
ispis ++ $ i. "" dok ($ i< 5 ) ;
ispis " \ n ";

$ i = 0;
ispis ++ $ i. "" do ($ i == 5);
ispis " \ n ";

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

Obratite pažnju na posljednju foreach petlju. Sjećamo se da je ovo skraćenica foreach, a ne for petlja, zar ne? Potonji, inače, nema kratki unos. Dakle, ovdje nije navedeno ime varijable, uz pomoć koje ćemo se pozivati ​​na elemente niza. Ne može se koristiti u foreach stenografiji. U ovom slučaju koristi se posebna varijabla - $ _. Sljedeći primjer je također prilično efikasan:

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

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

I naučili smo kako se brojevi i nizovi međusobno pretvaraju u hodu. Čak smo i vidjeli uvjetni izraz ako ali još nisam shvatio kako usporediti dva skalara. O tome bit će govor u ovom dijelu.

Ako imamo dvije varijable $ x i $ y, možemo li ih usporediti? Jesu li 1, 1,0 i 1,00 jednaki? Što je s "1.00"? Što je više, "foo" ili "bar"?

Dva skupa operatora za usporedbu

Perl ima dva skupa operatora za usporedbu. Baš kao i kod binarnih operatora zbrajanja (+), spajanja (.) i ponavljanja (x) koje smo već proučavali, i ovdje operator određuje kako se operandi ponašaju i kako se uspoređuju.

Ova dva skupa operatora su:

Vrijednost numeričkog niza == eq je jednak! = Ne nije jednak< lt меньше >gt više<= le меньше или равно >= ge je veće ili jednako

Operateri s lijeve strane uspoređuju brojčane vrijednosti, a na desnoj strani (u srednjem stupcu) usporedite vrijednosti na temelju ASCII tablice ili trenutnog jezika.

Pogledajmo nekoliko primjera:

Koristite stroge; koristiti upozorenja; koristiti 5,010; if (12.0 == 12) (recite "TRUE";) else (recite "FALSE";)

U ovom najjednostavnijem slučaju, Perl će ispisati TRUE jer == operator uspoređuje dva broja, tako da Perl ne brine jesu li napisani kao cijeli brojevi ili brojevi s pomičnim zarezom.

U sljedećoj usporedbi situacija je malo zanimljivija.

"12.0" == 12

ovaj izraz je također istinit jer Perlov operator "a ==" pretvara niz u broj.

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

Ovo se na prvi pogled može činiti neočekivanim, ali ako razmislite o tome, Perl uspoređuje nizove znak po znak. Dakle, uspoređuje "1" i "3", a budući da su različiti i "1" dolazi ispred "3" u ASCII tablici, u ovom trenutku Perl odlučuje da je niz 12 manji od niza 3.

Uvijek morate biti sigurni da uspoređujete vrijednost točno onako kako vam je potrebna!

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

Također će izdati upozorenje ako su (!) Upozorenja omogućena s upozorenjima upotrebe. Razlog za to je što koristimo dva niza kao brojeve u numeričkoj usporedbi ==. Kao što je spomenuto u prethodnom odjeljku, Perl gleda niz s lijeve strane i pretvara ga u broj koji tamo pronađe. Budući da oba niza počinju slovima, bit će pretvoreni u 0. 0 == 0, tako da je izraz istinit.

Na drugoj strani:

"foo" eq "bar" je netočan

Stoga uvijek trebate biti sigurni da uspoređujete vrijednost točno onako kako bi trebala!

Isto će biti i pri usporedbi

"foo" == "" bit će istina

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

Rezultati u ovoj tablici mogu biti korisni:

12,0 == 12 TOČNO "12,0" == 12 TOČNO "12,0" ekv. 12 NETOČNO 2< 3 ИСТИНА 2 lt 3 ИСТИНА 12 >3 TOČNO 12 gt 3 NETOČNO! (pažnja, na prvi pogled možda nije očito) "foo" == "" TOČNO! (Izdaje upozorenje ako se koristi pragma "upozorenja") "foo" eq "" FALSE "foo" == "bar" TRUE! (Izdaje upozorenje ako se koristi pragma "warnings") "foo" eq "bar" FALSE

I za kraj, primjer u kojem možete upasti u zamku tako da primite neke podatke od korisnika, pa pažljivo odsiječete redak na kraju, provjerite je li red prazan.

Koristite stroge; koristiti upozorenja; koristiti 5,010; ispisati "unos:"; moje $ ime = ; chomp $ ime; if ($ name == "") (# pogrešno! ovdje koristite eq umjesto ==! recite "TRUE";) else (recite "FALSE";)

Ako pokrenemo ovu skriptu i upišemo "abc", dobit ćemo TRUE odgovor, jer je perl odlučio da je "abc" isto što i prazan niz.

Vrhunski povezani članci