Выражения и операторы
Выражения и операторы
Оператор —
это часть текста программы, которую интерпретатор преобразует в законченную инструкцию, выполняемую компьютером. С точки зрения синтаксиса языка (способов составления правильных конструкций, распознаваемых интерпретатором) оператор состоит из
лексем
— минимальных единиц языка, которые имеют определенный смысл для интерпретатора. Под минимальной единицей языка понимается такая его единица, которая не может быть представлена более мелкими единицами при дальнейшем ее синтаксическом разборе. В языке Perl лексемами могут быть идентификаторы, литералы, знаки операций и разделитель.
Мы дадим определения всем допустимым в языке лексемам. Хотя их семантика (смысл) может оказаться для начинающих программистов и не совсем ясна, но мы вернемся к некоторым определениям в последующих главах, где уточним их и синтаксис, и семантику в связи с вводимыми элементами языка. Дело в том, что, к сожалению, невозможно описать язык без ссылок вперед.
Идентификатор —
это последовательность букв, цифр и символа подчеркивания "_", начинающаяся с буквы или подчеркивания и используемая для именования переменных, функций, подпрограмм, дескрипторов файлов, форматов и меток в программе. Программист может использовать любые правиль
ные идентификаторы для именования перечисленных объектов программы, если только они не совпадают с
ключевыми словами
языка — предопределенными идентификаторами, которые имеют специальное значение для интерпретатора языка Perl, например if, unless, goto и т. д. Примеры правильных и неправильных идентификаторов представлены в примере 2.3.
Пример 2.3. Правильные и неправильные идентификаторы
# Правильные идентификаторы
myNamel
my_Namel
_myName__l
# Неправильные идентификаторы
1
myName # Начинается с цифры.
-myName # Начинается не с символа буквы или подчеркивания.
my%Name # Используется недопустимый для идентификаторов символ
my
# my является зарезервированным словом.
Замечание
Забегая вперед, скажем, что так как имена переменных Perl начинаются со специального символа ("
$ ", "
@ ", "
% "), определяющего их тип, после которого следует идентификатор, то в этом случае использование идентификатора, совпадающего с ключевым словом Perl, является правомочным и не вызывает ошибку интерпретатора. Так, следующие имена переменных являются допустимыми:
$print ,
@do ,
%if , однако подобная практика не рекомендуется. Это замечание не относится к идентификаторам, используемым для именования дескрипторов файлов и меток, имена которых не начинаются с определенных символов.
(Как используются идентификаторы для объявления переменных см. )
(Как используются идентификаторы в дескрипторах файлов см. )
(Как используются идентификаторы для объявления форматов см. )
Литерал,
или буквальная константа, — символ или слово в языке программирования, определяющие в отличие от переменной свое собственное значение, а не имя другого элемента языка. Буквальные константы тесно связаны с типами данных, представимыми в языке, и являются, собственно говоря, их представителями. В Perl литералами являются числа и строки.
123 # Целое число.
23.56 # Вещественное число с фиксированной точкой.
2Е+6 # Вещественное число с плавающей точкой.
"Язык Perl" # Строковый литерал.
(О литералах см. в )
Знаки операций —
это один или более специальных символов, определяющих действия, которые должны быть выполнены над величинами, называемыми операндами. Выполняемые действия называются операциями, которые могут быть унарными (применяются к одному операнду), бинарными (применяются к двум операндам) и тернарные (участвуют три операнда).
Пример 2.5. Операции языка Perl
++$п; # Унарная операция (++)
23 * $п; # Бинарная операция (*)
$п >= 3 ? print "true" : print "false"; # Тернарная операция (?:)
(Об операциях и используемых знаках операций см. в )
Разделитель —
это символ ";", которым завершается любой оператор и который сообщает об этом интерпретатору. Использование разделителя позволяет на одной строке задавать несколько операторов, хотя это и не принято в практике программирования, так как ухудшает читаемость текста программы.
В операторе все его лексемы могут отделяться любым числом
пробельных символов,
к которым относятся сам пробел, знак табуляции, символ новой строки, возврат каретки и символ перехода на новую строку. Поэтому один оператор можно записать на нескольких строках и для этого не надо использовать никакого символа продолжения, требующегося в других языках программирования. Например, оператор номер 4 присвоения данных, введенных с клавиатуры, из примера 2.1 можно записать и так:
Пример 2.6. Использование пробельных символов в операторе
$name
= <STDIN>
;
Можно вообще не использовать пробельные символы в операторе, но для обеспечения читаемости программы мы рекомендуем отделять лексемы одним пробелом, тем более что могут встречаться ситуации, когда интерпретатор не однозначно выделяет лексемы из непрерывного потока символов.
Замечание
Так как пробельные символы не являются значащими в Perl, то обычно их используют для структуризации текста программы, которая заключается в написании некоторой группы операторов, логически подчиненных некоторой конструкции языка, с некоторым отступом относительно этой конструкции. Например, подобный подход можно применить к блоку операторов, выполняющихся в конструкции цикла, сдвинув все их вправо относительно этой конструкции. Структуризация текста программы способствует ее лучшему прочтению и широко практикуется программистами многих языков программирования, например языка С.
Операторы в языке Perl могут быть простыми или составными.
Простой оператор —
это выражение, завершающееся разделителем точкой с запятой ",-", и которое вычисляется исключительно ради своего побочного эффекта. Что такое побочный эффект выражения мы определим немного позже, а сейчас остановимся на понятии "выражение".
Выражение —
последовательность литералов, переменных и функций, соединенных одной или более операцией, которые вычисляют скаляр или массив, т. е. при обработке интерпретатором выражения единственным действием является вычисление значения, а не выполнение некоторых других действий, например присвоение переменной нового значения. При вычислении выражения могут проявляться побочные эффекты, когда при вычислении выражения меняется значение переменной, входящей в выражение. Они могут вызываться, например, операциями увеличения (++) и уменьшения (--) или при вызове функции, которая изменяет значение своего фактического параметра. Как упоминалось выше, простой оператор и выполняется, чтобы реализовать этот побочный эффект, иначе какой смысл просто вычислить выражение, значение которого никоим образом нельзя использовать.
Пример 2.7. Простые операторы
++$n; # Значение переменной $n увеличивается на единицу.
123*$n; # Простой оператор без побочного эффекта.
Каждый простой оператор может иметь модификатор, который располагается после выражения перед завершающей точкой с запятой. Модификаторы представляют собой ключевые слова if , unless , while и until , за которыми следует некоторое выражение. Семантика использования модификатора заключается в том, что простой оператор выполняется, если истинно или ложно выражение, стоящее после модификатора, в зависимости от используемого модификатора. Модификаторы употребляются так же, как и в обычном разговорном английском языке. Например, простой оператор
$n++ while <STDIN>;
будет выполняться, увеличивая всякий раз значение переменной $n на единицу, пока пользователь будет осуществлять ввод с клавиатуры. Остановить выполнение этого оператора можно вводом комбинации клавиш <Ctrl>+<Z>ium <Ctrl>+<C>.
Замечание
Язык Perl вобрал в себя лучшие элементы других языков программирования, в основном С. Конструкция модификаторов заимствована из умершего языка BASIC/PLUS фирмы Digital Equipment Corp.
(Подробно все модификаторы простых операторов рассматриваются в )
Чтобы определить конструкцию, называемую составным оператором, нам придется сначала ввести понятие "блок". Последовательность операторов Perl, определяющая область видимости переменных, называется
блоком.
После знакомства с переменными это определение не будет таким туманным, каким оно может показаться сейчас начинающему программисту. Для целей этой главы достаточно мыслить блок как последовательность операторов, заключенную в фигурные скобки:
{ оператор_1;
оператор_n; }
Составной оператор определяется в терминах блока и может быть одного из следующих видов:
Пример 2.8. Составные операторы
if (выражение)
БЛОК
if (выражение)
БЛОК_1
else
БЛОК__2
if (выражение_1)
БЛОК_1
elsif (выражение_2)
БЛОК_2 ...
else
БЛОК_п
МЕТКА
while (вьражение)
БЛОК
МЕТКА
while (вьражение)
БЛОК_1
continue
ЕЛОК_2
МЕТКА
for (вьражение_1; выражение_2; аьражение_3)
БЛОК
МЕТКА
foreach
переменная (список) БЛОК .МЕТКА БЛОК_1
continue
БЛОК_2
Обратим внимание читателя на то, что, в отличие от языков программирования С и Pascal, составные операторы Perl определяются в терминах блоков, а не в терминах операторов. Это означает, что там, где нужен блок, он всегда должен задаваться с помощью фигурных скобок. В составных операторах, если даже блок состоит из одного оператора, он должен быть заключен в фигурные скобки. Такой синтаксис не приводит к двусмысленностям и, например, во вложенных операторах условия всегда ясно, с каким if
согласуется
else
или
elsif
. Метка, представляющая собой идентификатор с двоеточием ":", в составных операторах не обязательна, но если она присутствует, то имеет значение для операторов управления циклами
next ,
last и
redo .
(Подробно все составные операторы рассматриваются в )
В этой главе мы познакомились с основными синтаксическими понятиями, используемыми для формирования правильных конструкций языка Perl. Узнали из каких основных элементов состоит Peri-программа, а также разработали и выполнили нашу первую программу.