Пятница, 24.11.2017, 10:23
Приветствую Вас Гость | RSS
Главная | Лекции | Регистрация | Вход
Меню сайта
Форма входа
Логин:
Пароль:
Категории раздела
Лекция [24]
Мини-чат
100
Поиск
Наш опрос
Оцените мой сайт
Всего ответов: 2
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    Программирование Perl
    Главная » Статьи » Лекция » Лекция

    Лекция 4.2: Управляющие структуры

    Модификаторы

    Порядок выполнения действий в простом предложении можно задавать с помощью модификаторов выражений. За любым выражением может стоять один из следующих модификаторов:

    выражение if выражение
    выражение unless выражение
    выражение while выражение
    выражение until выражение
    выражение foreach список

    Модификатор задает условие выполнения (в случае if или unless ) или повторения (в случае whileuntil или foreach) выражения. Выражение модификатора вычисляется в первую очередь, хотя и стоит в конце конструкции. Хотя модификаторы похожи на условные и циклические управляющие конструкции, но они формируют простые предложения и поэтому не могут быть вложенными. Приведенную выше конструкцию выбора можно переписать с использованием условных модификаторов:

    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;

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

    Выражения с do и eval

    В программах на 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; # число пи

    С помощью прагмы 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 не навязывает разработчику никаких ограничений. Общепринятые рекомендации по стилю оформления программ изложены в разделе стандартной документации, который можно просмотреть с помощью команды:

    perldoc perlstyle

    В соответствии c устоявшимися традициями, типичная программа на языке Perl скорее всего будет выглядеть примерно так:

    # вводные комментарии к программе
    use strict; # включение дополнительной...
    use warnings; # ... диагностики
    # use Env; # подключение нужных модулей (см. лекцию 13)
    # package main; # объявление пакета (см. лекцию 13)
    
    my $message = 'Привет!'; # объявление переменных и
    print $message; # запись алгоритма программы
    
    # описание форматов отчета (см. лекцию 10)
    # описание подпрограмм (см. лекцию 12)
    __END__ # необязательное обозначение конца программы

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

    perldoc perlsyn
    Категория: Лекция | Добавил: mazay (06.02.2014)
    Просмотров: 58 | Рейтинг: 0.0/0
    Всего комментариев: 0
    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]
    Создать бесплатный сайт с uCozCopyright MyCorp © 2017