![]() |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
|
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
|
||||
KOMENTARZE | ||||
Tylko zarejestrowani użytkownicy mogą dopisywać komentarze.
|
1. |
Pacman linux Download: 5004x |
2. |
FreeBSD Download: 9214x |
3. |
PCLinuxOS-2010 Download: 8700x |
4. |
alcolix Download: 11096x |
5. |
Onebase Linux Download: 9809x |
6. |
Novell Linux Desktop Download: 0x |
7. |
KateOS Download: 6372x |
1. |
xinetd Download: 2535x |
2. |
RDGS Download: 937x |
3. |
spkg Download: 5040x |
4. |
LinPacker Download: 10209x |
5. |
VFU File Manager Download: 3311x |
6. |
LeftHand Mała Księgowość Download: 7340x |
7. |
MISU pyFotoResize Download: 2973x |
8. |
Lefthand CRM Download: 3673x |
9. |
MetadataExtractor Download: 0x |
10. |
RCP100 Download: 3270x |
11. |
Predaj softveru Download: 0x |
12. |
MSH Free Autoresponder Download: 0x |