В качестве идентификаторов недопустимо использовать зарезервированные для использования в
синтаксисе языка ключевые слова, которые имеют для интерпретатора определенное значение и
используются при создании различных языковых конструкций:
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. Для передачи значений
фактических параметров используется специальный массив @_, непосредственное использование
элементов которого в операторах подпрограммы реализует механизм передачи параметров по ссылке.
Реализация механизма передачи параметров по значению осуществляется с использованием локальных
переменных, которым присваиваются значения фактических параметров через указанный специальный массив @_.
Итак, подытожим изученное нами в этой главе.
- Язык Perl является императивным языком, и его программа состоит из последовательности
операторов и строк комментариев, которые обрабатываются интерпретатором так, как они заданы
в программе, за исключением подпрограмм.
- Первым оператором программы должен быть оператор специального комментария, в котором для
системы UNIX задается расположение интерпретатора и передаваемые ему ключи, устанавливающие
режим его работы; для системы Windows специальный комментарий не обязателен, если только не
устанавливаются режимы работы интерпретатора непосредственно из программы.
- Основные типы данных языка — скаляр, содержащий либо числовые, либо строковые данные, массив
скаляров и хэш-массив.
- В языке нет специальных операторов объявления типа используемых переменных — для этого
используется специальный префикс перед ее идентификатором: $ — для скалярной переменной, @ — для
массива скаляров, % — для хэш-массива.
- Операторы языка делятся на простые и составные, причем составные определяются в терминах
блоков, что исключает двусмысленности в их трактовке, связанные с тем, какие операторы принадлежат
той или иной части составного оператора.
- Подпрограмма определяется с помощью ключевого слова sub и ее определение может располагаться
в любом месте программы.