|
Въвеждане на данни
STDIN, filehandles Понякога Вие трябва да контактувате с потребителя за да получите информация и да вършите действие с нея. Пробвайте това: CODE
Има нови елементи, които трябва да научите тук. Първо <STDIN> . STDIN е filehandle. Filehandles са неща, които служат за да се взаймодейства с обектите като файлове, сокети, входни данни и др. Може да се каже, че STDIN е стандартната функция за вход. В този случай STDIN чете от клавиатурата (входните данни въведени от потребителя). Този тип скоби - <> чете данни от filehandle. И така ние прочитаме въведените данни от STDIN. Зададената стойност се установява на провенливата $name и принтирани. Някаква идея защо има още един ред. Като натиснете Enter, Вие включвате нов ред във вашите данни. Лесния начин да премахнете новия ред е чрез CODE
CODE
CODE
Премахването е опасно, в период когато най-важното нещо е сигурността при програмирането. Безопасно премахване чрез chomp Ние искаме да премахваме само символа за нов ред, а не безогледно, които и да е последен символ. Това може да стане с chomp - който премахва последния символ само, ако той е за нов ред. chomp ($name=<STDIN>); И тук Perl гурутата извикват "Открих грешка!". Е добре, chomp не винаги премахва последния символ, ако той е за нов ред, но ако не го премахне, Вие имате специалната променлива, наречена $/ .Като зададете нов символ на тази променлива, тази стойност става символа за нов ред, на която стойността по подразбиране е n. Масиви Какво са масивите? В Perl има два типа масиви, асоциативни масиви (хешове) и масиви. И двата масива са списъци. Списъкът с сбор от променливи. Може да мислити за списъците в Perl като за стадо от животни. Списъка се обръща към цялото стадо, а скалара се обръща само към едно животно (Много МУУУУУУ стана,А?). Списъкът е стадо от променливи. Не е задължително променливите да бъдат от един и същи тип. Може да имате три скалара, два масива и три хеша в един масив. Всеки тип от списък си има свое име в Perl. Масивите представляват списък от стойности. Дефиницията на масив в другите езици е: съвкупност от еднотипни елементи (с еднаква големина). В Perl обаче всеки елемент може да е различен и с произволна дължина, следователно масивът е съставен от разнородни по състав елементи. За това често масивът е наричан списък. Масивите се означават с @ - която наподобява "a"(Аrray-масив). Основи на работата с масиви За пример, масива е списък от стойности. Списъка може да се обръща към целия списък или към отделни елементи от него. Скрипта по долу задава масива наречен @names . Зададени са 5 стойности в масива. CODE
Елементите на масива Масивите не са много полезно нещо ако не можем да се обръщаме към стойностите в него. Първо ако извикваме единичен елемент от масив не трябва да използваме префикса @ който се използва за обръщение към няколко стойности. Ако ни трябва единична стойност, то това ще е скалар, а префикса за скалар е $ . Второ ние трябва да укажем, кой точно елемент искаме. Това е лесно - $array[0] за първия елемент, $array[1] за втория и т.н.. Индексът на списъците започва от 0, докато не направите нещо което да промени това (нещо, което е твърде нежелателно и противопоказно за добро и пълноценно програмиране). И последно, използвахме масива в скаларен контекст за да видим колко елемента има, чрез scalar(@names) в по-горния пример. Как да се обръщаме към елементите на масив CODE
CODE
което задава на $x стойност 0, прави един цикъл, прибавя единица към $x , проверява дали е по-малка или равна на $#names , и т.н.. Това е пример за цикъл. За да бъде по-детайлно, цикъла има три части: • Инициализация • Проверка на условието • Модификация В този случай, променливата $x е инициализирана на 0. След това веднага е проверена дали е по-малка или равна на $#names . Ако е истина, блокът се изпълнява веднъж. Ако условието не е изпълнено и блока не се изпълнява. Един път след като блока се изпълни, променливата се модифицира. Това е $x++ . След това теста за изпълнение на условието се изпълнява и т.н.. За циклите с .. - оператор за поредица Има и друг начин за написването на по-горния код: CODE
който използва оператора за поредица .. (две точки една до друга). Това просто задава на $x стойност 0, после увеличава $x с 1 докато стане равно на $#names . През цялото това време изпълнява блока по веднъж на всяко увеличаване с единица. CODE
Цикъла минава през всеки елемент ('многократно повторение', друго техническо описание на процеса) на масива @names , и всеки елемент се връща като стойност на променливата $person . След това може да извършвате всякакви действия с променливата. Вие може да използвате и: CODE
Невероятното $_ За да намалим кода , ще Ви преставя $_ , които е входа по подразбиране и шаблонна променлива. CODE
Ако Вие не зададете променлива в която да се присвояват като стойности, елементите на масива , $_ се използва по подразбиране за тази и много, много други операции в Perl. Още един пример с функцията print: CODE
Ние не определяме кой елемент да се принтира, затова $_ се изпозва по подразбиране. По дефиниция ако на print не е зададена променлива, тя използва стойността, която се намира в специалната променлива $_. Преждевременен край на повторения Процесът на повторенията завършва при постигането на някакво условие зададено първоначално или въобще не завършва. Следващия скрипт е пример за непрекъсваем процес, защото 1 е истина и условието е винаги истана. CODE
Друг начин да излезете от процеса е, ако при изреждането на елементите на масива намерим този, който ни трябва и продължаването на процеса се обезмисля. CODE
Оператора last изпълнява функцията прекъсване на процеса и излизане от цикъла. Не се тревожете за /Dr / това е регулярен израз, който ще бъде обяснен по-късно. Всичко, което трябва да знаете засега е, че връща истина ако намери съвпадение между това в скобите и подадената променлива. В случая когато открие съвпадение подава истина и функцията last се изпълнява. Контрол върху функцията last се извършва чрез етикети. Засега е просто, но почакайте! Ние се нуждаем от лекар, който го има и в списъка с имена, не просто само лекар. Следващия пример е за това: CODE
Първо се взима първия елемент на масива @names, изписва се на екрана, и след това се проверява за съвпадение с Dr, ако се открие съвпадение се изпълнява следващия блок. В него се изреждат всички елементи на масива @medics, и ако се открие, че съдържанието на променливата $doc съвпада със съдържанието на променливата $person се прекъсва изпълнението на този блок и се преминава към външния цикъл с нова променлива $person. Но има малък проблем, ние искаме при намиране на съвпадение да прекъснем изцяло цикъла, а не само изпълнението на вътрешния цикъл. Трябва да укажем на функцията last, кое точно искаме да прекъснем. Това става чрез етикети, като във следващия пример: CODE
Има само две промени тук. Дефинирали сме етикет с името LBL. Когато укажем на last даден етикет, той прекъсва функцията, на която е зададен първоначално този етикет. Има още две функции за работа с цикли redo и goto. Redo връща на току-що изпълнилото се $_. Goto изпраща към друг цикъл, подпрограма или израз за изчисляване. Не се препоръчва използването му. Промяна на елементите на масив И така имаме масива @names. Искаме да го променим. Пробвайте следващия код: CODE
Сега имаме два масива. pop функцията премахва последния елемент на масив и го връща, което означава че може да извършите някакви действия с върнатата стойност. Функцията unshift прибавя стойност в началото на масив. В таблицата по долу са изборени функциите, които се използват за работа с масив. push Прибавя стойност към края на масив. pop Премахва и връща последната стойност на масив. shift Премахва и връща първата стойност на масив. unshift Прибавя стойност към началото на масива. Сега за достъпа до другите елементи на масива. Ще Ви представя функцията splice. CODE
Първия аргумент на функцията splice е масив. Втората стойност е индекс (число) показващо, коя стойност от списъка (масива) да се използва за начало. В този случай тя е 1 (ще се започне от втория елемент). После идва елемента, който показва колко елементи да се премахнат от масива и да се прибавят към втория. Ако използвате резултата от splice като скалар: CODE
тогава скалара взема като стойност последната му подадена стойност. Функцията splice се използва и за триене на елементи от масив. Триене на променливи от масив Искаме да изтрием Hamburg от масива. Как да го направим? Може би ето така: CODE
Разбира се Hamburg е премахнат, но забележете, броят на елементите остана един и същ. Все още има 4 елемента в масива. Резултата от горния код е, че $cities[1], съществува но няма стойност. И така ние трябва да използваме splice функцията за да премахнем елемента изцяло. CODE
print "Car is defined !n" if defined $car; Този код ще върне истина. Примерите дотук поставят въпроса, всъщност как да премахнем невъзвратимо една променлива. Много просто, ето как: CODE
Променливата $car е унищожена, тя липсва. Флагове Вие знаете, че може да пуснете режима с повече предупреждения и обяснения при грешки с -w от командния ред. Всяка опция на perl, която може да се зададе от командния ред, може да се зададе и в кода на скрипта. perl script.pl hello за да изпълни този код: CODE
perl -w script.pl hello Много по-удобно е да се слагат флагове вътре в скриптовете. Не е задължително да е -w , може да е всеки аргумент който Perl поддържа. Стартирайте perl -h за пълния списък на аргументите. use strict; Какво е това строгост (strict) и как да я използваме? Модулът strict ограничава 'несигурните, опасните конструкции', съгласно perl документацията. Няма смисъл да се притеснявате за опасни конструкции, ако сте прекарали часове наред в дебъгване на кода си. Когато включите модула strict , има три неща които Perl държи да са зададени точно: • Променливите 'vars' • Референциите 'refs' • Подпрограмите 'subs' При използването на този модул трябва променливите да се декларират преди използването им, като всяка променлива се дефинира с my . Това е пример за програма, която не използва стриктен режим: perl script.pl "Alain James Smith"; където "" затваря стринга като единичен параметър, иначе той ще се разглежда като три параметъра. CODE
Global symbol "$name" requires explicit package name at n1.pl line 3. Global symbol "$inis" requires explicit package name at n1.pl line 6. Global symbol "$luck" requires explicit package name at n1.pl line 8. Global symbol "$initials" requires explicit package name at n1.pl line 14. Execution of n1.pl aborted due to compilation errors. Тези предупреждения означават, че на Perl не му е ясно какъв е обсега на действие на тези променливи. Това означава, че Вие трябва да декларирате всяка една от тях с my, за да ограничите изпълнението им в дадения блок, в който се използват, или да им се зададе референцията с тяхното пълно име. В долния пример се използват и двата метода: use strict; CODE
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||









