Не сте регистриран! Регистрирайте се БЕЗПЛАТНО, за да използвате услугите на сайта!

   Рубрики
 
 
 
 

 Форуми
» SEO и оптимизация
» Всичко за PHP и Perl
» Всичко за C, C++ и .NET
» Всичко за Java и JSP
» Всичко за SQL и MySQL
» Всичко за XHTML и CSS
» Презентация на сайтове
 PERL - ПЕТА ЧАСТ
  1. PERL - ПЕТА ЧАСТ
deam0n
     
Автор  deam0n (19.02.2005 17:10)  съобщение до автора
Погледнат  3433 пъти  добави към любими
Оценка  добави коментар
Гласове  2  изпрати на приятел
Коментари  (0)  абонирай се за Perl
    Страница 1 / 1

 



Тук ще разгледаме видовете условни оператори и операторите за цикъл в Perl. Преди да започнем с условните оператори и циклите, трябва да дефинираме какво е за perl истина и лъжа. Ето обобщение:

    * Празния низ "" е лъжа.
    * Числото 0 и низът "0" са лъжа.
    * Празния списък () е лъжа.
    * Недефинираната стойност е лъжа.
    * Всико останало е истина.

   Това е вярно, но има няколко уловки. Например низове, които съдържат невидими символи (интервали, празни редове) се приемат за истина. Също и низове, които имат числова стойност 0, но не са нула (например низа "0.0") също се приема за истина.
  Ще започнем с оператора за цикъл for, за който ви споменах миналата глава. Както само отбелязах тогава, чрез for може да обхождаме както масиви, така и хешове. Синтаксисът на for e следния:

CODE
1
for ИТЕРАТОР (СПИСЪК ИЛИ МАСИВ) {БЛОК}

  Ако не осигурим наша собствена итераторна променлива, perl ще използва променливата по подразбиране $_. Както и в Java Script, края на конструкцията не се нуждае от точка и запетая.
  Когато for, обработва масив, той последователно установява итераторната променлива да бъде копие на всеки един елемент от списъка или масива. Сега нека напишем програма, която вдига всички числа от даден масив на квадрат и след това ги показва на монитора:


CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl
#ex25.plx
use warnings;
use strict;
my @numbers = (1 .. 5);
for my $number (@numbers) {$number **= 2}
for (@numbers) {print $_,"n"}

>
perl ex25.plx
1
4
9
16
25

>

Тук се използват два цикъла (не, че не може и с един). В първия цикъл сме задали итерационна променлива, а във втория, използваме променливата по подразбиране. Ако искате да знаем номера на текущо обработвания елемент, може да използвате следната конструкция :

CODE
1
for (0 .. $#numbers) {statemensts}

Това, което прави $#numbers е да даде номера на последния елемент в масива.
  Ако вместо масив, подадете хеш, резултатите няма да са такива каквито сте очаквали. Това, което ще получим са както ключове, така и стойности без индикация кое какво е. Perl обаче предоставя функции, чрез които може да заобиколите този проблем.
  Първата функция е keys (%hash). Тя ни дава списък от ключовете на хеша.

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl
#ex26.plx
use warnings;
use strict;
my %city = (
       
Ivan => "Sofia",
       
Petko => "Plovdiv",
       
Josh => "Dalas"
       
);
for (keys %city){
   
print "$_ lives in $city{$_}.n";
   
}

>
perl ex26.plx
Ivan lives in Sofia
.
Petko lives in Plovdiv.
Josh lives in Dalas.
>

Възможно е изхода, който ще получите да не е същият като показания.Аналогична на функцията keys е values. Тя обаче връща всички стойности в хеша. Последната функция е each, тя връща всеки елемент от хеша като двойка ключ/стойност.
   Друг оператор, който може да използвате за обхождане на масиви е оператора foreach. Кой от двата цикъла ще използвате е ваше решение - perl и в двата случая ще направи едно и също. Perl позволява да използваме for и по различен начин от показания. Нека напишем програма, която прави сума от всички елементи на масив:

CODE
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl
#ex27.plx
use warnings;
use strict;
my @numbers = (1,4,6,2);
my $sum = 0;
$sum += $_ for @numbers;
print "Total sum is : $sumn";

>
perl ex27.plx
Total sum is
13
>

 Това се нарича модификатор на конструкции и ще го видим отново и при следващите оператори.
   Друг оператор за цикъл е while. Неговия синтаксис е:

CODE
1
while (условие) {действие}

Този цикъл ще извършва дейстивието във фигурните скоби, докато условието е истина. Ето и един прост while цикъл :

CODE
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl
#ex28.plx
use warnings;
use strict;
my $num = 0;
while ($num < 10) {
print "$num ";
$num++;
}

>
perl ex28.plx
0 1 2 3 4 5 6 7 8 9 >

Следващия цикъл е този при, който тялото се изпълнява поне веднъж. Синтаксиса му е следния:

CODE
1
do {действие} while (условие)

Тук проверката е след изпълнението на тялото на цикъла, което гарантира неговото изпълнение поне веднъж. Както и преди, можете да използвате while за модификатор на конструкции, ето как става:

CODE
1
конструкция while условие;

Ето горния пример, написан с модификатор на конструкции:

CODE
1
2
3
4
5
6
7
8
9
#!/usr/bin/perl
#ex29.plx
use warnings;
use strict;
my $num = 0;
print "$num " while ++$num < 10;

>
perl ex29.plx
1 2 3 4 5 6 7 8 9 >

Противоположната конструкция на while е until. Той има същият синтаксис и се изпълнява, докато условието е лъжа. Той е аналогичен на конструкцията while (not условие){...}.
   Първия условен оператор, който ще научим е оператора if. Той има следния синтаксис :

CODE
1
if (проверка) {действие}

Действието ще се изпълни само ако проверката върне стойност истина. Друга форма на if e когато имаме определено действие, когато условието е истина и друго , когато е лъжа :

CODE
1
if (проверка) {действие 1} else {действие 2}

Понякога обаче ще се налага да проверяваме повече от едно условие. Например ако имаме няколко взаимносъврзани условия, може да проверите дали първото условие е вярно, ако не проверяваме второто и т.н. Това става със следната конструкция :

CODE
1
2
3
4
if (условие 1) {действие 1}
elsif (условие 2){действие 2}
elsif (условие 3) {действие 3}
else {действие 4}

Тук "действие 4" ще се изпълни само ако всичките условия пропаднат. Perl не притежава вградена switch конструкция, както Java Script или С например. Но с помоща на разгледания по-горе синтаксис на if e възможно написването на конструкция, която има същото дейстивие както и switch. Това е един от начините, другите обаче ще ви оставя да научите сами.
   Аналогично на while и if си има своя обратна конструкция - оператора unless. unless има същото действие както if (not условие) {...}.
   if също може да се използва като модификатор на конструкции, подобно на while.

CODE
1
конструкция if условие;

Това е много удобно за малки условия и когато започнете да програмирате, без да искате ще започнете да използвате този синтаксис, често във вашите програми. Сега да упражним if с прост пример, който ще визуализира само четните числа от масив:

CODE
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl
#ex30.plx
use warnings;
use strict;
my @numbers = (1 .. 10);
foreach (@numbers) {
   
print "$_ " if (($_%2)==0);
}

>
perl ex30.plx
2 4 6 8 10 >

Какви проверки може да правим. Ами освен най - обикновенните като сравнение на числа и низове, може да проверим дали даден ключ съществува в някакъв хеш. Това става със запазената дума exists. Конструкцията е следната:

CODE
1
if (exists $hash{kes}) {...}

Друга проверка, кочто може да правим е проверката дали дадена променлива е дефинирана. Това става със запазаната дума defined:

CODE
1
if (defined $somevar) {...}

Може би се досещате за още един начин за правене на прости проверки - отложеното изчисление. То беше обяснено в предишните глави, а тук само ще покажа как да го използвате:

CODE
1
defined $somevar or die "Var not defined";

Какво прави тази конструкция. Ами ако не е дефиниране променливата $somevar , тя просто спира изпълнението на програмата. Това става с оператора die, чието действие е да спре програмата и да изпечата текст, обясняващ каква точно е грешката. Това е много използван оператор, както ще забележите по нататък.
   Както и в Java Script, Perl също позволява спирането на цикли или пропускането на итерации. Спирането на цикъл става със запазената дума last. Когато perl срещне last, той прекъсва цикъла в същият момент. Следващия пример използва last, за да прекъсне цикъла при достигане на числото 5 :

CODE
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl
#ex31.plx
use warnings;
use strict;
my @numbers = (1 .. 10);
foreach (@numbers) {
   
last if ($_ == 5);
   
print "$_ ";
}

>
perl ex31.plx
1 2 3 4 >

Ако искате да пропуснете останалата част от обработката, но не и да прекъсвате цикъла, може да използвате next. При срещането на next цикъла преминава към изпълнение на следващата итерация. Следващата програма пропуска всички четни елементи :

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/perl
#ex32.plx
use warnings;
use strict;
my @numbers = (1 .. 5);
foreach (@numbers) {
   
if (($_%2) == 0) {
       
print "Skipping even element.n";
       
next;
   
}
   
print "$_n";
}

>
perl ex32.plx
1
Skipping even element.
3
Skipping even element.
5

 В редки случаи може да поискате да се върнете в началото на цикъла, но без да проверявате условието. Ако искате да направите нещо подобно използвайте оператора redo.
   В много редки случаи може да ви се наложи да използвате нещо подобно:

CODE
1
2
3
4
5
6
OUTER:while (условие 1){
   
INNER:for (списък) {
    ...
   
last OUTER if (условие 2);
   
}
}

  Тук OUTER и INNER са т.нар. етикети. Етикета винаги завършва с двоеточие и може да бъде поставен където си поискате. В горния случай ние казваме на perl да прекъсне външния (while) цикъл, при истина на условие 2. Ако не използвахме етикети, то perl ще прекъсне вътрешния (for) цикъл. Това е един от редките (ама наистина редките) случаи, когато може да използвате етикети. Разбира се това не е ограничение на Perl. Напротив, Perl ни предоставя оператора goto, чрез който може да скачате от етикет на етикет и да направите вашите програми наистина объркани. Това е защото чрез goto, вашата програма може да поеме в произволна посока по всяко време и навсякъде във файла, даже и в друг файл. Даже и да не разбирате защо не трябва да използвате goto, то пак не го използвайте.
   Следващата глава ще ви загатне за силата на регулярните изрази. Ако наистина искате да използвате Perl не я пропускайте в никакъв случай.



   


Ключови думи: perl програмиране оператор code код цикъл масив


Още уроци от тази рубрика


 
  • Подобни теми от myLinks
 

 1 посетител чете този урок (0 потребители и 1 гост)  
Активни потребители: ---
   
  

Еmail  
 

 

 
  • Интересно от Софтуер
 



IT-PLACE.NET © 2004 - 2008