Основные положения синтаксиса

Алфавит языка Perl состоит из букв латинского алфавита (строчных и прописных), арабских цифр, знака подчеркивания и специальных символов, представленных в табл. 2.1. Латинские буквы и цифры называются алфавитно-цифровыми символами. Perl является примером языка, синтаксис которого чувствителен к регистру, то есть в нем различаются прописные и строчные буквы алфавита.
Таблица 2.1.Специальные символы языка Perl

Символ Название Символ Название
` Обратная кавычка ~ Тильда
! Восклицательный знак @ Коммерческое AT
# Номер $ Знак доллара
% Процент ^ Крышка
& Амперсанд * Звездочка
- Минус + Плюс
= Равенство | Вертикальная черта
' Одинарная кавычка " Меньше
< Меньше > Больше
/ Наклонная черта \ Обратная наклонная черта
, Запятая . Точка
: Двоеточие ; Точка с запятой
[ Квадратная левая скобка ] Квадратная правая скобка
{ Фигурная левая скобка } Фигурная правая скобка
( Круглая левая скобка ) Круглая правая скобка
? Вопросительный знак   Пробел

Символы алфавита используются для задания лексем — минимальных единиц языка, имеющих определенный смысл для его интерпретатора или компилятора. Под минимальной единицей языка понимается такая его единица, которая не может быть представлена в виде совокупности других единиц при синтаксическом разборе текста программы. В языке Perl лексемы представлены идентификаторами, литералами (буквальными константами) допустимых типов данных, знаками операций и разделителем.
Идентификатор представляет собой последовательность буквенно-цифровых символов и символа подчеркивания, начинающуюся с буквы или символа подчеркивания. Он используется в языке Perl для именования переменных, функций, дескрипторов файлов, форматов и меток. Количество используемых в идентификаторе символов в описании языка не определено.
В качестве идентификаторов недопустимо использовать зарезервированные для использования в синтаксисе языка ключевые слова, которые имеют для интерпретатора определенное значение и используются при создании различных языковых конструкций:
		if, elseif, else, unless, while, until, foreach, for, next, 
		continue, last, do, eval, goto, sub, my, return
Кроме перечисленных ключевых слов, используемых для формирования синтаксических языковых конструкций, в языке зарезервированными считаются названия всех стандартных функций, реализуемых в любом интерпретаторе perl. Мы не будем перечислять имена, так как количество их достаточно велико, приведем только в качестве примера имена уже известных нам функций open, print, die, my Перечислим правильные и неправильные идентификаторы.
1. Правильные идентификаторы:
  myName;
  my_Name;
  my_1_Name;
2. Неправильные идентификаторы:
  1_myName (начинается с цифры); 
  -myName  (начинается не с буквы или подчеркивания); 
  my%Name  (используется недопустимый символ); 
  my       (является зарезервированным словом).
ВНИМАНИЕ, Для переменных, представляющих скаляров, массивы скаляров и хэш-массивы, можно в качестве идентификатора в имени переменной использовать любое слово, в том числе и зарезервированное ключевое, так как имя переменной составляется из специального символа, определяющего ее тип ($, @, %), и непосредственно идентификатора. Поэтому коллизий с ключевыми словами не происходит. Однако лучше избегать подобной практики и для имен переменных использовать идентификаторы, имеющие осмысленное значения.
Литерал, или буквальная константа, используется в языке программирования для представления данных допустимых типов. В языке Perl литералы используются для задания числовых и строковых данных. Мы определим их в главе 3, когда будем изучать базовые типы данных Perl, но уже сейчас можем сказать, что их задание практически ничем не отличается от задания буквальных констант соответствующего типа в языке С. Вот некоторые способы задания литералов языка Perl:
  560    (целое число);
  56.09  (вещественное число с фиксированной точкой);
  56Е+1  (вещественное число с плавающей точкой);
  "Perl" (строковый литерал);
  'Perl' (строковый литерал).
Знаки операций — это один или несколько специальных символов, которые определяют некоторые действия, называемые операциями и выполняемые над допустимыми в операциях величинами. Эти участвующие в операции величины, которые обычно представляют данные допустимых в языке типов, называются ее операндами. В зависимости от количества участвующих в операции величин могут быть унарные (один операнд), бинарные (два операнда) и тернарные (три операнда) операции. Приведем некоторые операции языка Perl, указав в комментариях в скобках знаки операций. Их систематическое изучение начнется в главе 3 и будет продолжено в других главах нашего учебного пособия.
  -$n;   — унарная операция отрицательного значения (-);
  ++$n ; — унарная операция увеличения на единицу (++);
  23 * $n ; — бинарная операция умножения (*);
  $n ** 5;  — бинарная операция возведения в степень (**);
  $n >= 3 ? print "true" : print "false"; — тернарная операция (?:).
В языке Perl допустим только один разделитель — символ точка с запятой ( ; ), который используется для обязательного завершения простых операторов, тогда как составные операторы могут вообще не завершаться разделителем. Они определяются в терминах блоков, и синтаксический анализатор всегда может определить завершающий блок такого оператора. Наличие в языке разделителя позволяет задавать на одной строке несколько операторов, хотя это и не рекомендуется, так как приводит к плохо читаемым программам.
Лексемы используются для задания в тексте программы специальных синтаксических конструкций (предложений языка программирования), которые интерпретатор преобразует в законченные инструкции, выполняемые компьютером. Эти синтаксические конструкции называются операторами.
В операторе все лексемы могут отделяться любым числом пробельных символов, к которым относятся сам пробел, символы табуляции и новой строки, возврат каретки и новая строка. Пробельные символы не являются значащими для интерпретатора Perl, а используются исключительно для создания хорошо читаемого текста программы. Такая трактовка пробельных символов интерпретатором позволяет задавать операторы в нескольких строках текста программы, не используя никакого символа продолжения. Принятая запись оператора:
  @file = <F1>
Этот же оператор можно записать и так:
  @
  file
  =				<F1>
  ;
Обратите внимание, что префикс @ идентификатора file, указывающий на то, что последний используется в качестве имени массива скаляров, может быть также отделен от своего идентификатора пробельными символами. Это связано с тем, что префикс типа переменной трактуется как символ операции определения типа в языке Perl, а поэтому является, естественно, лексемой, однако объявлять таким способом переменную не рекомендуется.
Язык Perl является императивным, или процедурным, языком программирования, поэтому программа представляет последовательность операторов, которые выполняются в том порядке, в каком они заданы в ее тексте.
Специальных операторов объявления типов используемых переменных в Perl не существует. Переменная считается объявленной в том месте программы, где она впервые появляется в тексте. Чтобы избежать использования неинициализированных переменных, можно при запуске интерпретатора perl с помощью ключа -w задать режим отображения предупреждающих сообщений. В этом случае при использовании в выражениях любой неинициализированной переменной будет отображаться сообщение вида:
  Use of uninitialized value in exponentiation (**} at ex.pl line 16.
ПРИМЕЧАНИЕ Ключ -w, как и любой другой ключ интерпретатора perl, можно задать либо в строке специального комментария текста программы, либо в командной строке через пробел сразу же после названии интерпретатора, но перед именем выполняемого файла.
В операторах используются выражения, которые представляют собой последовательность литералов, переменных и вызовов функций, соединенных одним или более символами операций. При обработке интерпретатором выражения единственным действием является вычисление его значения, но не выполнение действий, связанных с изменением состояния программы, например присвоение переменной нового значения.
Однако при вычислении выражения могут проявляться побочные эффекты, приводящие к изменению состояния программы. «Природа» подобных эффектов связана с тем, что некоторые операции и функции, используемые в выражении, могут приводить к изменению значений переменных, используемых в качестве операндов подобных операций, например, как в случае операций увеличения (++) и уменьшения (--) на единицу значения переменной. Некоторые функции выполняют определенные действия, например запись строк в файл или отображение информации на экране монитора компьютера. Использование выражений вне контекста операторов имеет смысл только в связи с их возможными побочными эффектами. Более того, если установлен режим отображения предупреждающих сообщений интерпретатора, то использование операторов без побочного эффекта вне контекста операторов приведет к появлению сообщения о бесполезности использования выражения в так называемом пустом (void) контексте:
  Useless use of exponentiation (**) in void context at ex01-l.pl  line 5.
Это сообщение может быть получено, если в тексте программы будет задан, например, следующий простой оператор: $n**2;
Все операторы Perl делятся на простые и составные. Простой оператор — это выражение, завершающееся точкой с запятой и вычисляемое исключительно ради своего побочного эффекта. Как упоминалось ранее в этой главе, простой оператор может быть снабжен модификатором, задаваемым после выражения; после модификатора следует другое выражение. Семантика простого оператора с модификатором такова: выражение будет вычислено, если значение выражения после модификатора удовлетворяет определенным условиям, зависящим от используемого модификатора. Допустимыми модификаторами являются следующие ключевые слова: if, unless, while и until. Все они имеют тот же смысл, что и в английском языке, если считать, что выражение после модификатора имеет значение «истинам» В простом операторе строки 04 листинга 2.1 нами использовался модификатор unless, и выражение оператора вычислялось, только если выражение после модификатора не имело значение «истина». Аналогично трактуются и другие модификаторы: if — если выражение после модификатора истинно, то вычисляется выражение простого оператора, while — выражение простого оператора будет вычисляться, пока истинно выражение модификатора, until — выражение простого оператора будет вычисляться, пока ложно выражение модификатора. Например, следующий простой оператор будет подсчитывать количество введенных пользователем с клавиатуры строк данных, пока не будет нажата комбинация клавиш Ctrl+z, так как в этом случае оператор ввода возвращает значение «ложь»:
  $n++ while <STDIN>;
Составной оператор в Perl представляет основные структуры управления программой и, в отличие от других языков программирования, определяется не в терминах самих операторов, а в терминах блоков, представляющих собой последовательность операторов, заключенную в фигурные скобки. Поэтому в Perl всегда ясно, например, с каким if согласуется else или elseif в операторе ветвления. Покажем в общем виде синтаксис составных операторов языка Perl:
	if (выражение) БЛОК;
	if (выражение) БЛОК_1 else БЛОК_2;
	if (выражение_1) БЛОК_1 [elsif (выражение_2) БЛОК_2] ... else БЛОК_n;
	МЕТКА while (выражение) БЛОК;
	МЕТКА while (выражение) БЛОК_1 continue БЛОК_2;
	МЕТКА for (выражение_1; выражение_2; выражение_3) БЛОК;
	МЕТКА foreach переменная (список) БЛОК;
	МЕТКА БЛОК_1 continue БЛОК_2;
Мы не будем сейчас останавливаться на семантике составных операторов, так как цель этой главы — дать общее представление о структуре простой программы и используемых синтаксических конструкциях и понятиях языка Perl. Отметим только, что метка в Perl представляет собой идентификатор, завершающийся двоеточием, например Label 1:. Метки в составных операторах являются необязательными, но необходимы, если требуется прервать нормальное выполнение цикла специальными операторами управления next, last и redo.
Завершая разговор об операторах, следует обратить внимание читателя на то, что в Perl любой оператор возвращает некоторое вычисленное значение. Так, в операторе цикла таковым будет возвращаемое значение последнего выполненного в его теле оператора, значением простого оператора будет либо значение вычисляемого в нем выражения, либо возвращаемое значение функции, если простой оператор состоит из единственного вызова функции.
Для повторного использования в программе некоторого кода во всех языках программирования используется управляющая конструкция подпрограммы. В языке Perl подпрограмму можно объявить в любом месте текста программы с помощью ключевого слова sub, за которым следует имя подпрограммы. Тело подпрограммы, то есть последовательность операторов, выполняющих определенные действия, задается в последующем блоке. Возвращаемым значением функции по умолчанию является значение последнего выполненного оператора. Если необходимо указать его явно, то следует использовать в теле подпрограммы оператор return, как в функции replасе листинга 2.1. Для передачи значений фактических параметров используется специальный массив @_, непосредственное использование элементов которого в операторах подпрограммы реализует механизм передачи параметров по ссылке. Реализация механизма передачи параметров по значению осуществляется с использованием локальных переменных, которым присваиваются значения фактических параметров через указанный специальный массив @_.
Итак, подытожим изученное нами в этой главе.

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


Реклама