|
Тук ще разгледаме видовете условни оператори и операторите за цикъл в Perl. Преди да започнем с условните оператори и циклите, трябва да дефинираме какво е за perl истина и лъжа. Ето обобщение:
* Празния низ "" е лъжа. * Числото 0 и низът "0" са лъжа. * Празния списък () е лъжа. * Недефинираната стойност е лъжа. * Всико останало е истина. Това е вярно, но има няколко уловки. Например низове, които съдържат невидими символи (интервали, празни редове) се приемат за истина. Също и низове, които имат числова стойност 0, но не са нула (например низа "0.0") също се приема за истина. Ще започнем с оператора за цикъл for, за който ви споменах миналата глава. Както само отбелязах тогава, чрез for може да обхождаме както масиви, така и хешове. Синтаксисът на for e следния: CODE
Ако не осигурим наша собствена итераторна променлива, perl ще използва променливата по подразбиране $_. Както и в Java Script, края на конструкцията не се нуждае от точка и запетая. Когато for, обработва масив, той последователно установява итераторната променлива да бъде копие на всеки един елемент от списъка или масива. Сега нека напишем програма, която вдига всички числа от даден масив на квадрат и след това ги показва на монитора: CODE
Тук се използват два цикъла (не, че не може и с един). В първия цикъл сме задали итерационна променлива, а във втория, използваме променливата по подразбиране. Ако искате да знаем номера на текущо обработвания елемент, може да използвате следната конструкция : CODE
Това, което прави $#numbers е да даде номера на последния елемент в масива. Ако вместо масив, подадете хеш, резултатите няма да са такива каквито сте очаквали. Това, което ще получим са както ключове, така и стойности без индикация кое какво е. Perl обаче предоставя функции, чрез които може да заобиколите този проблем. Първата функция е keys (%hash). Тя ни дава списък от ключовете на хеша. CODE
Възможно е изхода, който ще получите да не е същият като показания.Аналогична на функцията keys е values. Тя обаче връща всички стойности в хеша. Последната функция е each, тя връща всеки елемент от хеша като двойка ключ/стойност. Друг оператор, който може да използвате за обхождане на масиви е оператора foreach. Кой от двата цикъла ще използвате е ваше решение - perl и в двата случая ще направи едно и също. Perl позволява да използваме for и по различен начин от показания. Нека напишем програма, която прави сума от всички елементи на масив: CODE
Това се нарича модификатор на конструкции и ще го видим отново и при следващите оператори. Друг оператор за цикъл е while. Неговия синтаксис е: CODE
Този цикъл ще извършва дейстивието във фигурните скоби, докато условието е истина. Ето и един прост while цикъл : CODE
Следващия цикъл е този при, който тялото се изпълнява поне веднъж. Синтаксиса му е следния: CODE
Тук проверката е след изпълнението на тялото на цикъла, което гарантира неговото изпълнение поне веднъж. Както и преди, можете да използвате while за модификатор на конструкции, ето как става: CODE
Ето горния пример, написан с модификатор на конструкции: CODE
Противоположната конструкция на while е until. Той има същият синтаксис и се изпълнява, докато условието е лъжа. Той е аналогичен на конструкцията while (not условие){...}. Първия условен оператор, който ще научим е оператора if. Той има следния синтаксис : CODE
Действието ще се изпълни само ако проверката върне стойност истина. Друга форма на if e когато имаме определено действие, когато условието е истина и друго , когато е лъжа : CODE
Понякога обаче ще се налага да проверяваме повече от едно условие. Например ако имаме няколко взаимносъврзани условия, може да проверите дали първото условие е вярно, ако не проверяваме второто и т.н. Това става със следната конструкция : CODE
Тук "действие 4" ще се изпълни само ако всичките условия пропаднат. Perl не притежава вградена switch конструкция, както Java Script или С например. Но с помоща на разгледания по-горе синтаксис на if e възможно написването на конструкция, която има същото дейстивие както и switch. Това е един от начините, другите обаче ще ви оставя да научите сами. Аналогично на while и if си има своя обратна конструкция - оператора unless. unless има същото действие както if (not условие) {...}. if също може да се използва като модификатор на конструкции, подобно на while. CODE
Това е много удобно за малки условия и когато започнете да програмирате, без да искате ще започнете да използвате този синтаксис, често във вашите програми. Сега да упражним if с прост пример, който ще визуализира само четните числа от масив: CODE
Какви проверки може да правим. Ами освен най - обикновенните като сравнение на числа и низове, може да проверим дали даден ключ съществува в някакъв хеш. Това става със запазената дума exists. Конструкцията е следната: CODE
Друга проверка, кочто може да правим е проверката дали дадена променлива е дефинирана. Това става със запазаната дума defined: CODE
Може би се досещате за още един начин за правене на прости проверки - отложеното изчисление. То беше обяснено в предишните глави, а тук само ще покажа как да го използвате: CODE
Какво прави тази конструкция. Ами ако не е дефиниране променливата $somevar , тя просто спира изпълнението на програмата. Това става с оператора die, чието действие е да спре програмата и да изпечата текст, обясняващ каква точно е грешката. Това е много използван оператор, както ще забележите по нататък. Както и в Java Script, Perl също позволява спирането на цикли или пропускането на итерации. Спирането на цикъл става със запазената дума last. Когато perl срещне last, той прекъсва цикъла в същият момент. Следващия пример използва last, за да прекъсне цикъла при достигане на числото 5 : CODE
Ако искате да пропуснете останалата част от обработката, но не и да прекъсвате цикъла, може да използвате next. При срещането на next цикъла преминава към изпълнение на следващата итерация. Следващата програма пропуска всички четни елементи : CODE
В редки случаи може да поискате да се върнете в началото на цикъла, но без да проверявате условието. Ако искате да направите нещо подобно използвайте оператора redo. В много редки случаи може да ви се наложи да използвате нещо подобно: CODE
Тук OUTER и INNER са т.нар. етикети. Етикета винаги завършва с двоеточие и може да бъде поставен където си поискате. В горния случай ние казваме на perl да прекъсне външния (while) цикъл, при истина на условие 2. Ако не използвахме етикети, то perl ще прекъсне вътрешния (for) цикъл. Това е един от редките (ама наистина редките) случаи, когато може да използвате етикети. Разбира се това не е ограничение на Perl. Напротив, Perl ни предоставя оператора goto, чрез който може да скачате от етикет на етикет и да направите вашите програми наистина объркани. Това е защото чрез goto, вашата програма може да поеме в произволна посока по всяко време и навсякъде във файла, даже и в друг файл. Даже и да не разбирате защо не трябва да използвате goto, то пак не го използвайте. Следващата глава ще ви загатне за силата на регулярните изрази. Ако наистина искате да използвате Perl не я пропускайте в никакъв случай.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||









