LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> Perl (6) - Pravdivostní výrazy

Perl Výrazy jsou základním kamenem programovacích jazyků. Je jimi cokoliv, co má nějakou hodnotu. Jinými slovy, výrazy se vyskytují v podstatě na každém řádku kódu.

11.4.2005 06:00 | Jiří Václavík | Články autora | přečteno 39752×

Každý zápis, jehož vyhodnocením získáme nějakou hodnotu, je výrazem. Připomeňme, že s výrazy se setkáváme již od počátku seriálu. Například konstanty (tedy samotná čísla nebo řetězce), proměnné, příkaz print jsou všechno výrazy. Dnes si uděláme jejich systematičtější přehled a značně rozšíříme arzenál operátorů, kterými se určuje, jak se má výraz vyhodnocovat.

Trochu nepřesně lze říci, že výraz se středníkem na konci se stává příkazem. Proto, pokud jakémukoliv příkazu odejmeme středník, získáme výraz. Příkaz tedy má také nějakou hodnotu - a to i když není potřebná. Například, k čemu nám je, že příkaz print vrátí hodnotu 1? Většinou k ničemu, nicméně z principu je vyhodnocení nezbytné, neboť musí jít vyhodnotit každý výraz. Dokonce lze říci, že program je posloupností výrazů a středníků.

Pravdivostním výrazem myslíme výraz, který se vyhodnocuje na typ pravda / nepravda (například test u podmínek). Ve skutečnosti je ale každý výraz pravdivostní. Vyhodnocením libovolného výrazu je totiž možné získat pravdu nebo nepravdu. I přesto se teď zaměřme jen na výrazy tvořené relačními, logickými a pro zajímavost i bitovými operátory.

Způsoby vyhodnocování

Začněme ukázkou. Co vytisknou následující příkazy?

print 9 > 6;
print 9 > 18;

V prvním případě bylo vytisknuto 1, ve druhém případě "" (tedy prázdný řetězec). Proč? Číslo 9 je skutečně větší než 6. Výraz se tedy vyhodnotí jako pravda a tiskne se hodnota true. Protože Perl neobsahuje žádný speciální booleovský datový typ, uchovávající pouze hodnoty false a true, tiskne se místo true hodnota 1. Naopak prázdný řetězec značí false.

Obvyklou konvencí je, že úspěšně vykonaný příkaz vrátí pravdivou hodnotu a neúspěšně vykonaný nepravdivou. Zkuste na základě tohoto a předchozího odstavce určit, co se vytiskne následujícím příkazem:

print print "";

Test porovnání dvou hodnot můžeme užít v podmínce:

$a = 3;
$b = 2;

if ($a > $b){# $a je skutečně větší než $b (3 > 2). Výsledkem tohoto výrazu je 1 - tedy true
    print '$a je větší než $b';
    print "\n";
}
else{
    print '$b je větší než $a';
    print "\n";
}

Všimněme si, že jsme použili apostrofy jako označení řetězce. To proto, aby se místo $a a $b nevytiskly jejich hodnoty. (i když by to v tomto případě zas tolik nevadilo)

Zkusme ještě další příklad:

if ($zisk < 0){
    if ($zakazky == 0){
        $bankrot = 1;
    }
    else{
        $zamestnancu *= 3/4;
    }
}
elsif ($zisk > 1e7){
    $plat *= 1.05;
}

Operátory pro porovnávání (relační operátory):

OperaceOperátor pro číslaOperátor pro řetězceCelý název
je rovno==eqEQual
není rovno!=neNot Equal
je menší než<ltLess Than
je větší než>gtGreater Than
je menší nebo rovno než<=leLess than or Equal
je větší nebo rovno než>=geGreater than or Equal
je menší, rovno nebo menší než<=>cmpCoMParison

Výsledky porovnávání čísel jsou intuitivní - řídí se zákony matematiky.

Ale jak se porovnávají řetězce? Perl vezme první znak levého operandu a porovná jej s pravým. To samé s druhým atd. Každý znak bere jako číslo, určené jeho ASCII hodnotou. První odlišnost, kterou Perl objeví rozhodne o výsledku porovnání. Není-li žádná odlišnost, výrazy jsou si rovny.

$a = 4;
$b = 8;

#výraz $a == $b bude vyhodnocen jako false. 4 není rovno 8
if ($a == $b){ 
    print "$a == $b\n";
}

#výraz $a != $b bude vyhodnocen jako true. 4 není rovno 8.
if ($a != $b){ 
    print "$a != $b\n";
}

#výraz $a > $b bude vyhodnocen jako false. 4 není větší než 8.
if ($a > $b){ 
    print "$a > $b\n";
}

#výraz $a != $b bude vyhodnocen jako true. 5 * 4 je větší než 2 * 8.
if (5 * $a >= 2 * $b){ 
    print "5 * $a >= 2 * $b\n";
}

#'a' je v ASCII tabulce paradoxně až za 'A', takže je větší.
#Platí, že jakékoliv malé písmeno je vždy větší než jakékoliv velké písmeno.
if ("a" gt "A"){ 
    print "a > A\n";
}

#u číselného porovnávání se Perl řídí matematicky správně, u řetězců to ale zdánlivě neplatí.
#"1slon" bude vyhodnocen jako 1, "slon" jako 0. 1 > 0
if ("1slon" == "slon"){ 
    print "1slon > slon\n";
}

#slon sice není 1slon, ale je to myš. Oba výrazy budou vyhodnoceny jako 0, tudíž se rovnají.
if ("slon" == "myš"){ 
    print "slon == myš\n";
}

Operátor <=> vrací hodnotu 1, je-li pravý výraz větší než levý, hodnotu -1, je-li levý výraz větší než pravý nebo hodnotu 0, jsou-li výrazy na obou stranách stejné.

$a = 1;
$b = 2;

print $a <=> $b; #-1
print $b <=> $a; #1
print $a <=> 1;   #0

Logické operátory

Obyčejné testy většinou nestačí. Občas potřebujeme podmínku typu je-li a > b a zároveň a > d. Od toho jsou logické operace.

OperaceOperátorCéčkovský zápis
Konjunkce (logické a)and&&
Disjunkce (logické nebo)or||
Negacenot!
Defined-or //

Céčkovský zápis operátorů má stejný význam jako operátory, liší se jen v prioritě.

Konjunkce je splněna, jsou-li oba její operandy true. Disjunkce je splněna, je-li alespoň 1 její operand true (je-li true první operand, druhý je přeskočen a už se nevyhodnocuje - výsledek by to neovlivnilo; této vlastnosti můžeme použít při konstrukcí podmínek bez řídících konstrukcí).

aba and ba or b
1111
1001
0101
0000

Defined-or dělá totéž jako logické nebo až na to, že levý operand je testován na definovanost (nikoliv na pravdivost). Nebudeme se jím zatím zabývat, avšak jde o užitečný nástroj pro konstrukci podmínek bez řídících konstrukcí.

Negace vrací opačnou hodnotu než její operand. Jde o unární operátor.

$a = 4;

#1 je true, $a také, proto je test vyhodnocen jako true
if (1 and $a){ 
    print "1. test\n";
}

#1 je true, ale prázdný řetězec ne, proto je test vyhodnocen jako false
if (1 and ""){ 
    print "2. test\n";
}

#1 je true, výsledek je taky true
if (1 or ""){ 
    print "3. test\n";
}

#1 je true, výsledek je taky true
if (1 or 2){ 
    print "4. test\n";
}

#1 je true, negace obrací výraz, takže test je false
if (!1){ 
    print "5. test\n";
}

#1 and "MP" je true, potom je true i 0 or (1 and "MP"). Tento celý výraz je operandem
#druhého or a protože je true, je i tato operace or true. Výsledek negujeme a dostáváme false.
if (!(0 or (1 and "MP") or ($a and ""))){ 
    print "6. test\n";
}

Přiřazení jako test podmínky

Jako test se hojně používá i přiřazení (nejčastěji ve spojení se čtením dat ze souboru, databáze apod.). Přiřazujeme-li hodnotu true, je i celý test true. Přiřazujeme-li hodnotu false, je test také false.

if ($a = 0){ #0 je false
    print "TRUE\n";
}
else{
    print "FALSE\n";
}

Připomeňme, že to není porovnávání. To bychom museli použít operátor ==.

Příklad - absolutní hodnota

Zkusme napsat program, který vypíše absolutní hodnotu čísla. Stačí vynásobit hodnotu číslem -1, pokud je záporná.

#!/usr/bin/env perl
use strict;

my $hodnota = -3;

if ($hodnota < 0){
    $hodnota *= -1;
}

print "$hodnota\n";

Chceme-li, dá se podmínka pomocí podmínkového operátoru zahrnout přímo do funkce print.

#!/usr/bin/env perl
use strict;

my $hodnota = 3;

print $hodnota < 0 ? $hodnota * -1 : $hodnota . "\n";

V tomto případě se nejdříve vyhodnotí výraz $hodnota < 0 ? $hodnota * -1 : $hodnota a poté se tiskne.

Bitové operátory

Ještě se zmiňme o dalším typu operací - bitových. Pokud vás nezajímají, klidně tuto část přeskočte, protože se s nimi běžný člověk nesetkává často.

Bitové operace mají význam jen v případě celočíselných operandů (zadáme-li desetinné číslo, Perl si desetinnou část odřízne). Podívejme se na tabulku bitových operátorů.

OperátorOperacePočet operandů
~bitová negace (bitové not)1
&bitový součin (bitové and)2
|bitový součet (bitové or)2
^exkluzivní bitový součet (bitové xor - výlučné nebo)2
>>bitový posun doprava2
<<bitový posun doleva2

Bitové operátory fungují tak, že je operand (nebo operandy) převeden do dvojkové soustavy. U operátorů &, | a ^ Perl postupně porovnává bity na stejných pozicích.

Následující tabulka ilustruje význam bitových operátorů:

bit abit ba & ba | ba ^ b
00000
01111
10111
11110

bitové not

Každý výsledný bit je doplňkem bitu operandu do 1. Funguje tudíž na různých počítačích jinak (podle rozsahu čísla). Zkusíme negaci pro 110101110000101:

    0b11111111111111111111111111111111
$a  0b00000000000000000110101110000101
    ----------------------------------
~$a 0b11111111111111111001010001111010

bitové and

Pokud jsou v pravém i levém operandu bity na stejných pozících 1, výsledkem na daném bitu je 1. V ostatních případech je výsledkem 0.

$a = 1631;
$b = 55;
print $a & $b; #23

1631 a 55 vyjádříme ve dvojkové soustavě. Odtud je zřejmé, jak se k výsledku došlo.

$a      0b11001011111    1631
$b      0b     110111      55
        -------------     ----
$a & $b 0b00000010111      23

bitové or

Pokud jsou v operandech oba bity na stejných pozicích 0, výsledkem bitu na dané pozici ve výsledku je 0. Vyskytne-li se v jednom z nich 1 (tedy všechny ostatní případy), výsledkem je 1.

$a = 1322;
$b = 986;
print $a | $b; #2042

To je zřetelné odtud:

$a      0b10100101010    1322
$b      0b 1111011010     986
        -------------    ----
$a | $b 0b11111111010    2042

bitové xor

Číslice 1 a 0 nebo 0 a 1 se vyhodnotí jako 1, v ostatních případech je výsledkem 0.

$a = 30549;
$b = 6806;
print $a ^ $b; #28099

Bitově:

$a      0b111011101010101    30549
$b      0b001101010010110     6806
        -----------------    -----
$a ^ $b 0b110110111000011    28099

bitový posun

Operátor >> umazává zprava bity, operátor << (zleva) přidává nuly.

$a = 61;
$b = 2;
print $a >> $b; #15
print $a << $b; #244

Bitově:

$a        0b  111101     61
$b                 2      2
        ----------    ---
$a >> $b  0b    1111     15
$a << $b  0b11110100    244

Verze pro tisk

pridej.cz

 

DISKUZE

tabulka - bitovy sucet 1.11.2011 23:20 jozef riha
  L Re: tabulka - bitovy sucet 10.11.2014 19:03 Libor Suchý
    L Re: tabulka - bitovy sucet 10.11.2014 19:09 Libor Suchý




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

16.7.2018 1:05 /František Kučera

Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.


Přidat komentář

18.6.2018 0:43 /František Kučera
Červnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 21. 6. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát na téma: F-Droid, aneb svobodný software do vašeho mobilu. Kromě toho budou k vidění i vývojové desky HiFive1 se svobodným/otevřeným čipem RISC-V.
Přidat komentář

23.5.2018 20:55 /Ondřej Čečák
Od pátku 25.5. proběhne na Fakultě informačních technologií ČVUT v Praze openSUSE Conference. Můžete se těšit na spostu zajímavých přednášek, workshopů a také na Release Party nového openSUSE leap 15.0. V na stejném místě proběhne v sobotu 26.5. i seminář o bezpečnosti CryptoFest.
Přidat komentář

20.5.2018 17:45 /Redakce Linuxsoft.cz
Ve čtvrtek 31. května 2018 připravuje webový magazín BusinessIT ve spolupráci s Best Online Média s.r.o. pátý ročník odborné konference Firemní informační systémy 2018. Akce proběhne v kongresovém centru Vavruška (palác Charitas), Karlovo náměstí 5, Praha 2 (u metra Karlovo náměstí) od 9:00 hod. dopoledne do cca 15 hod. odpoledne. Konference je zaměřena na efektivní využití firemních informačních systémů a na to, jak plně využít jejich potenciál. Podrobnější informace na webových stránkách konfrence.
Přidat komentář

14.5.2018 7:28 /František Kučera
Květnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 17. 5. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát na téma: Audio – zvuk v GNU/Linuxu.
Přidat komentář

7.5.2018 16:20 /František Kučera
Na stránkách spolku OpenAlt vyšla fotoreportáž Pražské srazy 2017 dokumentující srazy za uplynulý rok. Květnový pražský sraz na téma audio se bude konat 17. 5. 2018 (místo a čas ještě upřesníme).
Přidat komentář

17.4.2018 0:46 /František Kučera
Dubnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 4. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tématem tohoto srazu bude OpenStreetMap (OSM) aneb svobodné mapy.
Přidat komentář

16.3.2018 22:01 /František Kučera
Kulatý OpenAlt sraz v Praze oslavíme klasicky: u limonády a piva! Přijďte si posedět, dát si dobré jídlo a vybrat z mnoha piv do restaurace Kulový blesk, který najdete v centru Prahy nedaleko metra I. P. Pavlova na adrese Sokolská 13, Praha 2. Sraz se koná ve čtvrtek 22. března a začínáme v 18:00. Heslo: OpenAlt. Vezměte s sebou svoje hračky! Uvítáme, když si s sebou na sraz vezmete svoje oblíbené hračky. Jestli máte nějaký drobný projekt postavený na Arduinu, nějakou zajímavou elektronickou součástku, či třeba i pěkný úlovek z crowdfundingové akce, neváhejte. Oslníte ostatní a o zábavu bude postaráno.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

20.2.2018 18:48 / Ivan Majer
portal

20.2.2018 15:57 / Jan Havel
Jak využíváte služby cloudu v podnikání?

16.1.2018 1:08 / Ivan Pittner
verejna ip od o2 ubuntu

15.1.2018 17:26 / Mira Harvalik
Re: Jak udělat HTML/Javascript swiping gallery do mobilu?

30.12.2017 20:16 / Michal Knoll
odmocnina

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2018) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze