![]() ![]() |
ARCHIV |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() ![]() ![]() ![]() ![]() ![]() |
|
Operace | Operátor pro čísla | Operátor pro řetězce | Celý název |
je rovno | == | eq | EQual |
není rovno | != | ne | Not Equal |
je menší než | < | lt | Less Than |
je větší než | > | gt | Greater Than |
je menší nebo rovno než | <= | le | Less than or Equal |
je větší nebo rovno než | >= | ge | Greater than or Equal |
je menší, rovno nebo menší než | <=> | cmp | CoMParison |
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
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.
Operace | Operátor | Céčkovský zápis |
Konjunkce (logické a) | and | && |
Disjunkce (logické nebo) | or | || |
Negace | not | ! |
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í).
a | b | a and b | a or b |
1 | 1 | 1 | 1 |
1 | 0 | 0 | 1 |
0 | 1 | 0 | 1 |
0 | 0 | 0 | 0 |
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";
}
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 ==.
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.
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átor | Operace | Poč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 doprava | 2 |
<< | bitový posun doleva | 2 |
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 a | bit b | a & b | a | b | a ^ b |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 1 | 1 | 1 |
1 | 0 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
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
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
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
Čí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
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
Příspívat do diskuze mohou pouze registrovaní uživatelé. |
28.11.2018 23:56 /František Kučera
Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1
12.11.2018 21:28 /Redakce Linuxsoft.cz
22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář
6.11.2018 2:04 /František Kučera
Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
4.10.2018 21:30 /Ondřej Čečák
LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář
18.9.2018 23:30 /František Kučera
Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
9.9.2018 14:15 /Redakce Linuxsoft.cz
20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business.
Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář
12.8.2018 16:58 /František Kučera
Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář
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ář
31.7.2023 14:13 /
Linda Graham
iPhone Services
30.11.2022 9:32 /
Kyle McDermott
Hosting download unavailable
13.12.2018 10:57 /
Jan Mareš
Re: zavináč
2.12.2018 23:56 /
František Kučera
Sraz
5.10.2018 17:12 /
Jakub Kuljovsky
Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?