Язык программирования Perl - [18]

Шрифт
Интервал

>$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; # число пи


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


>use locale;


По ходу изучения материала следующих лекций будут рассмотрены другие полезные прагмы, а в лекции 13 будет описано применение use для подключения внешних модулей.

Материал этой лекции иллюстрирует упоминавшийся в лекции 1 принцип TMTOWTDI: в Perl часто существует несколько синонимичных конструкций, предоставляющих автору программы возможность наиболее точно выразить свой замысел в привычном для него стиле. Perl - демократичный язык, и каждый пишет на нем так, как ему удобнее и привычнее: начинающий программист использует простые средства, писавший ранее на другом языке найдет для себя знакомые конструкции, а опытный Perl-хакер может углубиться в синтаксические дебри. За многие годы использования Perl целой армией программистов в нем сложились устойчивые выражения (idioms, идиомы), подобные пословицам и поговоркам в естественных языках. Для примера можно привести некоторые из них:


># 1. Выполнять бесконечный цикл

>for (;;) # читается "forever" - "всегда"

>{ } # тело бесконечного цикла

># 2. Открыть файл или аварийно завершить программу

>open FILE or die; # "открой файл или умри!"

># 3. Читать строки из входного потока и печатать их,

># используя буферную переменную по умолчанию

>while (<>) { print; }

># 4. Присвоить переменной значение по умолчанию

># только, если ее значение не определено

>$variable ||= $default_value;


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

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