Синтаксис на програмите
- Няма нужда от много синтаксис. Perl често сам се сеща какво имаме предвид.
- DWIM - Do What I Mean (Прави това, което имам предвид).
- TMTOWTDI
(There is More Than One Way To Do It).
- Избор на удобен стил
- Множетво стилове
- Избор на единен стил за проект или група проекти
Декларации
- Няма нужда от декларации, освен ако не работим в стриктен режим.
- Променливи - ако не ги декларираме с
my, our или local (по-детайлно в лекция 8), се приемат за undef.
- $a=5;
print "a is $a, sum is ".($a+$b)."\n";
- Процедури - използване като списъчни оператори, без скоби
- sub sumsq($$);
$s = sumsq 2, 5;
$s = sumsq(2, 5);
Примери - условни конструкции
- if (!open_file()) { # C-style
die("Failed");
}
unless (open_file()) {
die("Failed");
}
die("Failed") unless open_file(); # Ударение върху die()
open_file() or die("Failed"); # Препоръчителна форма
not open_file() and die("Failed");
unless ($sum > 5) {
display_error();
} elseif (!process()) {
display_error();
}
$sum > 5 and process() and display_result() or display_error();
($sum > 5) && process() && display_result() || display_error();
Примери - етикети за цикли
- while ($fn = read_student()) {
$found = 0;
for ('bachelor', 'master', 'phd') {
@g = sort {$a <=> $b} find_grade($_, $fn);
if ($g[0] <= 3) {
$found = 1;
last;
}
}
next if found;
# process @g for those who never got 3
}
STUDENT:
while ($fn = read_student()) {
for ('bachelor', 'master', 'phd') {
@g = sort {$a <=> $b} find_grade($_, $fn);
next STUDENT if $g[0] <= 3;
}
# process @g for those who never got 3
}
Цикли
- Почти не минава програма без тях :)
- Видове цикли според "живота"
- Видове цикли според мястото на условието
- преди изпълнението (while, until, for)
- след изпълнението (do..while)
Цикли - while, until, do..while
while (условие) блок - оценява условието и изпълнява блока, докато то е изпълнено
until (условие) блок - докато продължава да не е изпълнено
do блок while (условие) - блокът се изпълнява поне веднъж
do блок until (условие)
- безкраен цикъл -
while (1), until (0), do..while(1), do..until(0)
Примери - while, until, do..while
- while ($line = read_line()) {
print "Read a line: $line\n";
$text .= $line; # $text = $text . $line
}
until ($done) {
do_something();
do_something_else();
}
do {
($num, $denom) = input_data();
if ($denom == 0) {
print "Division by zero...\n";
} else {
print ($num / $denom)."\n";
}
} while (one_more_time());
Цикли - next, last, redo, continue
next - пропуска остатъка от блока, оценява условието
last - пропуска остатъка от блока, излиза от цикъла
redo - пропуска остатъка от блока, НЕ ОЦЕНЯВА условието
continue - изпълнява се в края на блока (или при next) преди оценката на условието
Пример - next, last, continue
- while ($line = read_line()) {
chomp $line;
next if $line eq "";
last if $line eq "EOF";
print "Read line: $line\n";
$text .= $line;
} continue {
$num_lines++;
}
Цикли - for
for (начало; условие; стъпка) блок
- начало
- условие? да - блок, стъпка
- условие? да - блок, стъпка
- условие? не - край.
- Еквивалентно представяне:
while (условие) блок continue стъпка
- Позволява
next, last, redo
Примери - for
- for ($i = 0; $i < 10; $i++) {
next if $i % 3 == 0;
$sum += $i;
}
"Грешка, грешка, голяма грешка..."
for ($i = 0; $i < 10; $i++) {
redo if $i % 3 == 0;
$sum += $i;
}
$i = 0;
while ($i < 10) {
next if $i % 3 == 0;
$sum += $i;
} continue {
$i++;
}