Чтение онлайн

на главную - закладки

Жанры

Язык программирования Perl

Шохирев Михаил Васильевич

Шрифт:

SWITCH: {

$t = -36, redo SWITCH unless defined $t;

$say = 'холодно', last SWITCH if $t < 10;

$say = 'прохладно', last SWITCH if $t < 18;

$say = 'тепло', last SWITCH if $t < 27;

$say = 'жарко';

}

Иногда удобно задавать повторение действия с помощью циклических модификаторов, например:

++$count, --$sum while (rand < 0.1);

$random = rand until $random > 0.7;

Применение

модификаторов делает программу легче для понимания, поскольку акцент переносится на основное действие, стоящее в начале предложения. К тому же запись упрощается, так как не используется блок, а условное выражение в модификаторе можно не заключать в круглые скобки.

В программах на Perl можно встретить ключевое слово do с последующим блоком, что похоже на управляющую структуру. Но конструкция do выступает в качестве терма в выражении. Иначе говоря, do делает из блока выражение, значением которого будет значение последнего предложения в блоке. Например, в такой операции присваивания:

$result = do { $x=rand; $a=0; } # в $result будет присвоен 0

Чтобы подобное выражение стало простым предложением, после него нужно поставить "точку с запятой". Вот так можно записать третий вариант конструкции выбора, где выражение do будет операндом условной операции, управляющей вычислением результата:

SWITCH: {

(defined $t) || do { $t = 15; redo SWITCH; };

($t < 10) && do { $say = 'холодно'; last SWITCH; };

($t < 18) && do { $say = 'прохладно'; last SWITCH; };

($t < 27) && do { $say = 'тепло'; last SWITCH; };

$say = 'жарко';

}

Выражение do, как и любое другое выражение, может использоваться с модификаторами. Например, с его помощью можно организовать циклическое выполнение действий:

do { $sum += rand; } until ($sum > 25);

Но поскольку эта конструкция - выражение, а не цикл, то операторы управления циклом в ней не работают.

Иногда требуется динамически вычислить значение строкового выражения или выполнить блок предложений, изолируя возможные ошибки выполнения. Для этого используется конструкция eval, которая применяется в одной из двух форм:

eval выражение # вычислить выражение как код на Perl

eval блок # выполнить блок, перехватывая возможные ошибки

В любой форме eval возвращает значение последнего вычисленного выражения. В первой форме строковое выражение рассматривается eval как исходный код на Perl, который во время работы программы динамически компилируется и выполняется. Если при его компиляции или выполнении возникает ошибка, eval возвращает неопределенное значение, но программа не заканчивается аварийно, а сообщение об ошибке помещается в специальную переменную $@.

Например:

$x = 0; $y = 5; # в выражении будет деление на 0

$expression = "$y/$x"; # строка, содержащая код для выполнения

$result = eval ($expression); # вычислить выражение

if ($@ eq '') { # проверить специальную переменную на ошибки

print "Выражение вычислено: $result";

} else {

print "Ошибка вычисления: $@";

}

Во второй форме блок предложений в конструкции eval, как и в конструкции do, становится выражением. Он компилируется обычным образом и выполняется во время работы программы, но возможные ошибки его выполнения также не приводят к аварийному завершению программы. Причину ошибки можно узнать из специальной переменной $@, а значением eval будет значение последнего предложения в блоке. Вот пример обработки ошибок в выражении eval:

$result = eval { # выполнить блок

$x = 0; $y = 5;

$z = $y / $x; # здесь будет деление на 0

}; # завершаем предложение точкой с запятой

unless ($@) { # проверить специальную переменную на ошибки

print "Выражение вычислено: $result";

} else {

print "Ошибка вычисления: $@";

}

В программе на Perl, помимо предложений и комментариев, применяются прагмы - указания компилятору и исполняющей системе выполнить какие-либо действия или начать работать в определенном режиме. Прагмы позволяют управлять поведением программы при компиляции и выполнении, их довольно много, и полное их описание можно найти в документации. Очень рекомендуется в начало любой программы включать прагмы, отвечающие за более тщательную проверку правил и ограничений:

use strict; # ограничить применение небезопасных конструкций

use warnings; # выводить подробные предупреждения компилятора

use diagnostics; # выводить подробную диагностику ошибок

Дополнительная диагностика компилятора поможет избежать многих ошибок при выполнении программы. Обычно прагмы могут включаться в любом месте программы с помощью ключевого слова use и выключаться при необходимости с помощью ключевого слова no, например:

use integer; # включить целочисленные вычисления

print 10 / 3; # результат: 3

no integer; # отключить целочисленные вычисления

print 10 / 3; # результат: 3.33333333333333

С помощью прагмы use constant можно определять в программе именованные константы, которые по традиции записываются заглавными буквами. Это делается таким образом:

use constant PI => 3.141592653; # число пи

Поделиться:
Популярные книги

А может, в этот раз?

Бреттон Барбара
Любовные романы:
современные любовные романы
6.50
рейтинг книги
А может, в этот раз?

Печать Пожирателя 3

Соломенный Илья
3. Пожиратель
Фантастика:
городское фэнтези
аниме
сказочная фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Печать Пожирателя 3

Когда нельзя отступить

Тюрин Виктор Иванович
Фантастика:
боевая фантастика
6.25
рейтинг книги
Когда нельзя отступить

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Санкт-Петербург. Автобиография

Королев Кирилл Михайлович
Научно-образовательная:
история
5.00
рейтинг книги
Санкт-Петербург. Автобиография

Игра с огнем

Джейн Анна
2. Мой идеальный смерч
Любовные романы:
современные любовные романы
9.51
рейтинг книги
Игра с огнем

Мир Приключений 1990 г.

Булычев Кир
Альманах "Мир приключений"
Фантастика:
научная фантастика
5.00
рейтинг книги
Мир Приключений 1990 г.

Фантастика 1981

Биленкин Дмитрий Александрович
Фантастика
Фантастика:
научная фантастика
5.00
рейтинг книги
Фантастика 1981

33 стратегии войны

Грин Роберт
Научно-образовательная:
психология
история
6.25
рейтинг книги
33 стратегии войны

Цикл "Идеальный мир для Лекаря". Компиляция. Книги 1-30

Сапфир Олег
Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Цикл Идеальный мир для Лекаря. Компиляция. Книги 1-30

Легат

Прокофьев Роман Юрьевич
6. Стеллар
Фантастика:
боевая фантастика
рпг
6.73
рейтинг книги
Легат

Пилот штрафной эскадрильи

Корчевский Юрий Григорьевич
Фантастика:
альтернативная история
5.79
рейтинг книги
Пилот штрафной эскадрильи

Газлайтер. Том 31

Володин Григорий Григорьевич
31. История Телепата
Фантастика:
боевая фантастика
попаданцы
альтернативная история
фэнтези
6.40
рейтинг книги
Газлайтер. Том 31

Воронцов. Перезагрузка

Тарасов Ник
1. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фантастика: прочее
5.50
рейтинг книги
Воронцов. Перезагрузка