Логически оператори са OR, NOT, AND и др.. Те всичките оценяват изрази. Оценените изрази връщат true (истина - 1) или false (лъжа - 0), в зависимост какъв критерии се използва за оценка от операторите.
or
or оператора работи както следва:
CODE1
| open STUFF, $stuff or die "Cannot open $stuff for read :$!"; |
Този код означава - ако операцията по отварянето на файла STUFF пропадне, тогава се спира прграмата. Друг пример:
CODE1
2
| $_=shift;
[i]^R[/i] or print "Doesn't start with Rn"; |
Ако регулярния израз върне лъжа (не е намерил ред започващ с R), тогава се изпълнява каквото е от лявата страна на or . Както знаете, shift изпълнвява действие върху @ARGV, ако не е зададена стойност, или върху @_ във подпрограма. Perl има два OR оператора. Единия ни е известния or, а другия е ||.
Приоритет: Кое се изпълнява първо
За да разберете разликата между двата оператора, трябва да поговорим за приоритета при изпълнението. Добър пример е следния:
CODEкоето както знаем ще изпечата 10. Но ако ние направим така:
CODEСега, това 2+8 == 10, разделено на 2 ли е или може би 8/2 == 4, плюс 2 == 6?
Приоритет е кое ще се изпълни първо. В примера горе може да видите, че делението се извършва преди събирането. Следователно, делението има предимство пред събирането.
Може да използвате скоби за да е по-чисто и чсно, коя след коя команда да се изпълнява:
CODE1
| perl -e"print ((2+8)/2) |
И така основната разлика между or и || е приоритета на изпълнение. В примера по-долу, ние се опитваме да присвоим на две променливи стойностите на два несъществуващи елемента на масив. Това ще пропадне:
@list=qw(a b c);
CODE1
2
3
4
5
6
7
8
| $name1 = $list[4] or "1-Unknown";
$name2 = $list[4] || "2-Unknown";
print "Name1 is $name1, Name2 is $name2n";
print "Name1 existsn" if defined $name1;
print "Name2 existsn" if defined $name2; |
Изходът е интересен. Променливата $name2 е създадена с фалшива стойност. Обаче, $name1 не съществува. Причината е в приоритетите на операциите. or оператор има по малък приоритет от || .
Това означава, че or поглежда на входа от лявата страна. В този случай, това е $name1 = $list[4] . Ако той е истина, всичко е наред. Ако е лъжа, дясната страна се пресмята, и лявата страна се игнорира, все едно никога не е съществувала. В примера горе, когато лявата страна се открива че е лъжа, дясната се пресмята, която е "1-Unknown" която може да е истина, но води до някакво действие (изход).
В случая на || , който има по-висок приоритет, израза от лявата страна веднага се пресмята. В случая е $list[4]. Той е лъжа, така че веднага се пресмята кода от дясната страна на оператора. Но кода от лявата страна които не е изчислен, $name2 = не е забравен. Следователно израза се изчислява не $name2 = "2-Unknown".
Примера по-долу ще Ви помогне да си доизясните нещата:
CODE1
2
3
4
5
6
7
8
9
| @list=qw(a b c);
$ele1 = $list[4] or print "1 Failedn";
$ele2 = $list[4] || print "2 Failedn";
print <<PRT;
ele1 :$ele1:
ele2 :$ele2: |
PRT
Друг пример:
CODE1
2
3
4
5
6
7
8
9
10
| @list=qw(a b c);
$name1 = $list[4] or "1-Unknown";
($name2 = $list[4]) || "2-Unknown";
print "Name1 is $name1, Name2 is $name2n";
print "Name1 existsn" if defined $name1;
print "Name2 existsn" if defined $name2; |
Сега, ($name2 = $list[4]) е самостоятелен израз който се изчислява, а не само $list[4], така че ние получаваме същия резултат, ако бяхме използвали or .
Трети пример:
CODE1
2
3
4
5
6
7
8
9
| $a = $b || $c;
$x ||= $y
$a = defined($b) ? $b : $c;
And |
Логическия оператор AND оценява два израза, и връща true само ако и двата са истина. Контраста е с OR, който връща истина само ако един или повече от два израза са истина. Perl има няколко AND оператора.
Първия вид AND е && :
CODE1
2
3
4
5
6
7
8
9
10
11
| @list=qw(a b c);
print "List is:@listn";
if ($list[0] eq 'x' && $list[2]++ eq 'd') {
print "Truen";
} else {
print "Falsen";
}
print "List is:@listn"; |
Изхода тук е лъжа. Ясно е, че $list[0] не съдържа x . AND оператора може да върне истина само ако и двата израза са истина, и така след като първия е лъжа perl решава, че няма смисъл да пресмята втория.