На этом шаге мы введем понятия составного оператора и блока.
Составные операторы – это второй тип операторов языка Perl. С их помощью реализуют ветвления в программе и организуют циклические вычисления. Эти операторы, в отличие от аналогичных операторов других языков программирования, определяются в терминах блоков – специальном понятии языка Perl, задающим область видимости переменных.
Блок – последовательность операторов, определяющая область видимости переменных. В программе блок обычно ограничен фигурными скобками. Интерпретатор рассматривает блок как один оператор, вычисляемым значением которого является значение последнего выполненного оператора блока. Это означает, что там, где можно использовать один оператор, можно использовать и блок. Блок определяет область видимости переменных. Это означает, что в блоке можно создать переменные, обращаться к которым можно только из операторов, расположенных в этом блоке. Такие переменные ещё называют локальными переменными. Локальные переменные создаются с помощью функции my(). Её параметром является список переменных, область видимости которых ограничена блоком, в котором вызывается эта функция. Если список переменных состоит из одной переменной, то скобки не обязательны. Созданные функцией my() переменные называются также лексическими переменными, так как область их действия ограничена фрагментом текста программы – блоком операторов.
В языке Perl можно создавать другой тип локальных переменных, область действия которых определяется динамически во время выполнения программы. Они создаются функцией local() и называются локальными динамическими переменными. Однако именно переменные, созданные функцией my(), являются “истинными” локальными переменными: они создаются при входе в блок и уничтожаются при выходе из него (хотя существуют ситуации, когда Perl не уничтожает локальную лексическую переменную при выходе из её области видимости). Функция local() всего лишь временно сохраняет старое значение глобальной переменной при входе в блок и восстанавливает его при выходе из блока.
Приведём пример, который демонстрирует области видимости лексических переменных.
$var = “outer”; # Глобальная переменная $var. $glob = “glob”; # Глобальная переменная $glob. my $lex = “outer_1”; # Лексическая переменная $lex. { my($var) = “inner”; # Внутренняя переменная $var. my($var1) = “inner_1”; # Внутренняя переменная $var. print “В блоке \$var = $var\n”; # Напечатает inner. print “В блоке \$var1 = $var1\n”; # Напечатает inner_1. print “В блоке \$lex = $lex\n”; # Напечатает outer_1. print “В блоке \$glob = $glob\n”; # Напечатает glob. } print “Вне блока \$var = $var\n”; # Напечатает outer. print “Вне блока \$lex = $lex\n”; # Напечатает outer_1. print “Вне блока \$var1 = $var1\n”; # Напечатает пустую строку.
На следующем шаге мы познакомимся с операторами ветвления.