Именованные блоки

В Perl блок операторов, заключенный в фигурные скобки, семантически эквивалентен циклу, выполняющемуся только один раз. Поэтому все рассмотренные нами команды управления выполнением цикла можно использовать в блоке операторов в фигурных скобках. Однако тот факт, что такой блок операторов должен выполняться только один раз, влияет на семантику команд управления циклом.
Команда last, как и в случае любого цикла, немедленно прекращает выполнение операторов блока и передает управление на первый посте блока оператор программы.
Команда next также завершает выполнение операторов блока, но кроме этого действия, в котором она аналогична действию команды last, предписывает выполнить операторы из блока continue, задающихся в случае блока операторов в фигурных скобках:
{
  $i = 1;
  last;
} continue { 
    ++$i;
  }
print "Переменная \$i после первого блока: $i\n";
{
  $i = 1;
  next;
} continue { 
    ++$i;
  }
print "Переменная \$i  после второго блока:  $i\n";
Первый оператор print этого фрагмента кода напечатает значение переменной $i равным 1, тогда как второй оператор print напечатает 2, так как при выходе из второго блока будет выполнен оператор увеличения на единицу переменной $i из его блока continue.
ПРИМЕЧАНИЕ При нормальном завершении простого блока операторов (без использования команд управления циклом) операторы блока continue обязательно будут выполнены при условии, естественно, что он определен.
Действие команды redo ничем не отличается от ее использования в циклах — она инициирует повторное вычисление операторов блока.
Использование блоков и команд управления выполнением цикла позволяет программировать достаточно сложные алгоритмы. Например, можно организовать бесконечный цикл без использования какого-либо оператора цикла (листинг 5.18).
Листинг 5.18. Организация цикла с помощью блока и команд управления
#! perl –w
$notempty = "";
$total = "";
$i=1;
{
  $line = <STDIN>;  # Ввод строки 
  $total .= $line;
  redo if $line =~ /^$/;  #Возврат на чтение строки,
                          # если введена пустая
  $notempty .= $line;
  ++$i;
  redo if $i <= 5;
}
print "Все строки:\n$total Непустые:\n$notempty";
Узнаете программу листинга 5.16? Действительно, это реализация без оператора цикла программы ввода пяти непустых строк. Единственное, что нам при шлось добавить — еще одну команду redo в конце блока операторов и переменную $i для подсчета количества введенных непустых строк.
Блоки могут иметь метки, и в этом случае их называют именованными блоками. Подобные конструкции используются для реализации переключателей — конструкций, которые не определены в синтаксисе языка Perl. Существует множество способов создания переключателей средствами языка Perl. Один из них представлен в листинге 5,19.
Листинг 5.19. Реализация переключателя
#! perl  -w 
$var = 3; 
SWITCH: {
  $case1 = 1, last SWITCH if $var == 1;
  $case2 = 1, last SWITCH if $var == 2:
  $case3 = 1, last SWITCH if $var == 3;
  $nothing = 1;
}
После выполнения именованного блока операторов SWITCH переменная $case1 будет равна 1, если $var равна 1, $case2 будет равна 2, если $var равна 2, и, наконец, $case3 будет равна 3, если $var равна 3. В случае если переменная $var не равна ни одному из перечисленных значений, то переменная $nothing будет равна 1. Конечно, это простейший переключатель, разработанный всего лишь для демонстрации возможности быстрого создания переключателя в Perl. Для выполнения группы операторов в переключателе можно использовать не модификатор if, а оператор выбора if.
Блоки могут быть вложенными друг в друга. Именованные блоки и команды управления циклом, используемые для выхода из внутренних блоков, позволяют создавать достаточно прозрачные конструкции, реализующие сложные алгоритмы.

Следующая страница Содержание главы


Реклама