Initial commit from the 2013 with minor fixes. From now and then,
[perlbook.git] / s02.tex
blob5407e5fc3487fdade012256eb25dbb49dcfa29a4
1 \section{Основы}
2 \subsection{Что и как?}
3 \begin{em}
4 PHP — это маленькое зло, созданное некомпетентными новичками, в то
5 время как Perl — это большое и коварное зло, созданное умелыми, но
6 извращёнными профессионалами.
7 \begin{flushright}
8 Jon Ribbens
9 \end{flushright}
10 \end{em}
12 Сначала немножко теории. В вики написано:
14 \begin{em}
15 „Perl — высокоуровневый интерпретируемый динамический язык
16 программирования общего назначения, созданный Ларри Уоллом, лингвистом
17 по образованию.”
18 \end{em}
20 Ларри подошел к созданию языка программирования как лингвист,
21 поэтому в результате получился очень необычный язык.
22 В своей книге „Программирование на Perl” он постоянно приводит аналогии
23 между Perl’ом и естественным языком.
24 Возможно поэтому Perl так лихо обрабатывает любую текстовую информацию.
25 Что ещё мы узнали? Perl язык интерпретируемый, это означает, что текст
26 программы\footnote{Программы на Perl часто называют
27 сценариями или ещё чаще скриптами}
28 содержится в простом текстовом файле и переводиться на язык,
29 понятный комфьютеру специальной программой (интерпретатором).
30 Интерпретатор постепенно читает программу на Perl
31 (которую принято называть СКРИПТОМ) и заставляет твою компьютер
32 выполнять её. Теперь задумаемся над тем, что же такое программа?
33 Думаю можно сказать, что это алгоритм, записанный на каком-либо языке
34 программирования. А алгоритм это последовательность действий, приводящая
35 к определенному результату. Обобщим. Чтоб извлечь ништяки из
36 компьютера,нужно составить алгоритм. Человек должен четко представлять,
37 как достичь результата. Далее, алгоритм нужно перевести на один из
38 понятных для машины языков и чем богаче язык — тем легче нам будет это
39 сделать. Поэтому мы будем писать на Perl, очень богатом и гибком языке.
41 Хватит лирики, что нам нужно, чтобы приступить?
42 \begin{enumerate}
43 \item Интерпретатор Perl
44 \item Хороший текстовый редактор
45 \end{enumerate}
47 У пользователей Linux скорей всего есть и то и другое.
49 %\begin{minipage}[t][\height][t]{\textwidth}
50 \vbox{
52 \textbf{Windows:}
53 \begin{itemize}
54 \item Качаем интерпретатор здесь:
56 http://strawberryperl.com/
57 \item На роль текстового редактора вполне подойдет Notepad++:
59 http://notepad-plus-plus.org/download/
60 \end{itemize}
61 %\end{minipage}
63 Специально для пользователей windows есть один финт. Чтоб не скакать
64 по каталогам и сразу запустить командную строку там где нужно:
65 \begin{enumerate}
66 \item Создаем где-нибудь папку, в которой будут храниться все наши скрипты.
67 \item В этой папке создаём файл с расширением „bat”. В файл добавляем
68 единственную строку:
70 \texttt{cmd.exe}
71 \end{enumerate}
72 Теперь для запуска командной строки достаточно дважды кликнуть по батнику.
74 Но это не все подводные камни, подстерегающие пользователя windows
75 на пути к Perl. Дело в том, что в консоли Windows используется кодировка
76 \emph{cp866} , а блокнот, например сохраняет текст в \emph{cp1251}. Поэтому русский
77 текст, содержащийся в скрипте, который писался в блокноте, будет выведен
78 на экран в не читаемом виде. Но это легко исправить, собственно для того
79 мы и скачали Notepad++. Перед тем, как набирать/вставлять из буфера
80 листинг устанавливаем нужную кодировку:
82 \texttt{Кодировка>Кириллическая>ОЕМ 866}
84 Кстати, копировать листинги из книги — плохая идея. Настоятельно
85 рекомендую перебивать их вручную. Во-первых, так лучше запоминается.
86 Во-вторых, текст не всегда копируется правильно. На данный момент
87 известен как минимум один глюк, с которым я ничего не могу поделать. Он
88 описан в третьем пункте FAQ.
90 Мальчик мой, ты готов стать мужчиной!
92 \subsection{Первая программа}
94 Когда программист перестает быть мальчиком? Само собой, написав первую
95 программу! А вот и она:
97 \perl{l01.pl}
99 Давайте разбираться, что же мы написали и как это запустить? Здесь надо
100 подумать. Понимаю не хочется. Тем более что в первый раз это больно. Все
101 листинги\footnote{Листинг --- текст скрипта. Его исходный код}
102 будут оформляться похожим образом. Строки пронумерованы,
103 чтоб на них можно было легко ссылаться. Не нужно копировать номера!
104 Первая строка будет присутствовать во всех листингах, но пользователям
105 Windows она не нужна! В любом случае, первая строка удобный ориентир.
106 Не копируйте из книги ничего, что стоит левее „\emph{\#!}”. Ладно,
107 запускаем первый листинг.
109 \textbf{На Linux:}
111 Есть как минимум два пути:
113 \begin{enumerate}
114 \item Копируете 2ю строчку в файл foo\footnote{foo,
115 bar и baz --- имена метапеременных. Это слова-заменители, которые применяются
116 в технических текстах для обозначения чего-либо,
117 что может стоять на их месте}.pl.
119 Теперь достаточно набрать в
120 консоли:
122 \texttt{perl foo.pl}
124 Скрипт будет выполнен. Если foo.pl лежит вне текущего каталога,
125 необходимо указать полный путь к файлу:
127 \texttt{perl /home/YOBA/perl/foo.pl}
129 \item Другой способ состоит в том, чтоб сделать скрипт „\emph{исполняемым}”.
130 Для этого необходимо скопировать в файл foo.pl обе строчки. В первой
131 строке содержится специальная управляющая последовательность —
132 \emph{\#!}”. Если строка начинается с неё, значит, далее в этой строке
133 прописан путь до интерпретатора Perl. Ключ „\emph{-w}” просит интерпретатор
134 выводить более подробные предупреждения и сообщения. Советую всегда
135 использовать его. Кстати, совершенно не обязательно, что в твоей
136 системе интерпретатор живет в папке /usr/bin. Чтобы точно узнать,
137 что же нужно писать в первой строке, достаточно ввести команду:
139 \texttt{which perl}
141 Также необходимо дать файлу со скриптом права на исполнение:
143 \texttt{chmod +x foo.pl}
145 Готово! Теперь скрипт можно запустить, просто набрав его имя в консоли:
147 \texttt{./foo.pl}
149 Если кто-то не знает, \emph{„./”} на Unix-подобных системах синоним для
150 текущего каталога. Также есть синоним для родительского каталога
151 \emph{\symbol{126}/}” . Дело в том, что Linux и Unix пользователи хранят свои лич-
152 ные файлы (а скрипты дело очень личное) где-то в своих домашних
153 каталогах. Например „\emph{/home/Yoba/perlperl/}” , так вот, чтоб не писать
154 \emph{/home/Yoba/}” , достаточно написать „\emph{\symbol{126}/}” .
156 Если foo.pl находится в каталоге отличном от текущего — необходимо
157 указать его полное имя . Полное имя включает в себя полный путь и % а как же относительный путь?
158 имя файла.
160 \item Можно обойтись вообще без файлов, используя знаменитые перловые
161 однострочники. Для этого вызываем интерпретатор с ключом \emph{„-e”}
162 \footnote{Данный
163 ключ говорит интерпретатору, что далее пойдет не имя файла со скриптом,
164 а код на Perl который нужно выполнить.}
165 и пишем наш однострочник, заключив его в одинарные кавычки:
167 \texttt{perl -e \textquotesingle print "YOBA ETO TI?\textbackslash n";}\textquotesingle
168 \end{enumerate}
170 \textbf{На Windows:}
171 Здесь всё просто. Создаём файл с расширением \remph{pl} , в папке со скриптами.
172 Там же должен лежать созданный ранее батник, запускаем его. В открывшейся консоли набираем:
174 \texttt{perl foo.pl}
176 Однострочник под Windows будет выглядеть иначе. Дело в том, что под
177 Windows скрипт должен быть заключен в двойные кавычки, поэтому нужно
178 заменить кавычки в print на их синоним-- конструкцию \remph{qq()}.
179 Всё, что находится в скобках, будет вести себя так же, как если бы его
180 заключили в двойные кавычки. В остальном для однострочников справедливо
181 все, что сказано для однострочников под Linux. Итак:
183 \texttt{perl -e "print qq(YOBA ETO TI?\textbackslash n);"}
185 Готово! Я у мамы программист!
187 Теперь давай разбираться в нашем первом скрипте. Что мы видим?
188 Во-первых, оператор print. Оператор -- это кусочек кода, который
189 что-то делает. В данном случае он осуществляет вывод на экран.
190 Каждый оператор отделяется точкой с запятой. Забытая точка с запятой
191 приведет к синтаксической ошибке.
193 Далее идёт заключенный в кавычки текст. При этом кавычки могут быть
194 как двойные, так и одинарные. В чем разница? Важный момент! Существует
195 такое понятие, как \remph{интерполяция} , иначе подстановка. В одинарных
196 кавычках подстановка \textbf{не} осуществляется. Хотя есть два исключения, это
197 \textbackslash\textquotesingle , для того, чтоб использовать одинарные кавычки в строке,
198 ограниченной ими же, и
199 \textbackslash\textbackslash, чтоб можно было \remph{отключить} слэш в
200 конце строки (иначе он отключит одинарную кавычку). В двойных
201 осуществляется и ещё как! Что это значит? Некоторые вещи, заключенные в
202 двойные кавычки имеют сакральный смысл. Например есть ряд символов,
203 начинающихся с бэкслэша:
205 \textbackslash t — табуляция
207 \textbackslash n — перевод строки
209 \textbackslash\textbackslash — бэкслэш
211 Тысячи их. В нашем примере мы используем перевод строки.
212 Советую запомнить этот спец. символ.
214 О комментариях. Всё что идёт после символа \emph{\#} считается комментарием.
215 Думаю, не нужно объяснять зачем комментировать скрипты? Остановимся на
216 менее очевидном применении комментариев. Можно целеком „закомментировать”
217 строчку, если не хочешь, чтоб она выполнялась по каким-либо причинам.
219 Ещё пара слов об однострочниках. Perl, как никакой другой язык
220 программирования, помогает людям в повседневной жизни, в том числе с
221 помощью однострочников. Однострочник -- это скрипт, записанный в одну
222 строку и переданный интерпретатору на исполнение непосредственно, без
223 создания файла не жестком диске. Ну действительно, зачем плодить лишние
224 сущности для скрипта-однодневки, вычисляющего значение конкретного
225 выражения? Кстати, именно благодаря однострочникам, Perl получил славу
226 непонятного и сложного языка. Скрипты, записанные одной строкой
227 действительно трудно читать. Понятность приносится в жертву удобству. Но %Не всегда трудно, можно запилить переводы строк.
228 однострочники обычно пишут раз и навсегда, не предполагая их изменения
229 в дальнейшем. Хотя конечно однострочник может содержать что угодно,
230 будь то фильтр текстовых строк, конвертер валют или интернет-магазин.
231 %\vskip
233 {\large{\textbf{Вопросы для самоконтроля:}}}
235 \begin{enumerate}
236 \item Что такое скрипт?
237 \item Для чего предназначен интерпретатор?
238 \item Чем программа отличается от алгоритма?
239 \item Из чего состоит полное имя файла?
240 \end{enumerate}
242 {\large{\textbf{Задания к разделу:}}}
244 \begin{enumerate}
245 \item Напишите однострочник, выводящий на экран следующий текст:
246 \begin{verbatim}
247 -$USERNAME, ДЕВУШКУ-ТО СЕБЕ НАШЕЛ?
248 -Нет.
249 -А ЧЕ ТАК? ТЫ ЧАСОМ НЕ ИЗ ЭТИХ?
250 \end{verbatim}
251 \item Что выведет на экран этот скрипт? Почему? Запустите его и проверьте
252 себя. Если ошиблись — 20 отжиманий.
253 \end{enumerate}
255 \perl{l02.pl}
257 \subsection{Типы данных}
258 \subsubsection{Скаляры}
260 Печатать фразы на экране быстро надоедает. Гораздо полезней было бы
261 начать проводить какие-нибудь вычисления. Но вычисления проводятся над
262 данными, а данные нужно где-то хранить. Для этого существуют переменные, а
263 точнее \emph{скаляры} . В скаляре может храниться практически всё, что
264 угодно, но только одно! Будь то числа, строки или, например, картинки.
265 Универсальный контейнер на все случаи жизни. Неважно, какие данные вы
266 хотите сохранить в скаляре, Perl всю рутину берёт на себя. В отличие,
267 например, от Си, в котором целые и вещественные\footnote{Вещественные ---
268 дробные числа} числа должны храниться в переменных разных типов.
270 Имя скаляра может содержать буквы латинского алфавита, цифры, символы
271 подчёркивания. Причем идентификатор\footnote{Идентификатор --- имя скаляра,
272 массива, хэша и т.п. Имя вашей переменной.} не должен начинаться с цифры.
273 Вот примеры имён скаляров:
275 \begin{itemize}
276 \item \$counter
277 \item \$thread\_4574321
278 \item \$my\_var
279 \end{itemize}
281 Внимательный читатель должен был заметить знак доллара. Это
282 \emph{разыменовывающий префикс} . Он говорит интерпретатору, что следующий
283 за ним текст — имя скаляра. Для каждого типа данных свой разыменовывающий
284 префикс. \$ — для скаляров. Легко запомнить, он похож на латинскую ’s’ в
285 слове ’scalar’. @ — для массивов, тоже легко запомнить, как лат. ’a’ в слове
286 ’array’. Ну и \% — для хэшей. Но об этом позже.
288 Важный момент! Perl регистрозависим. Это означает, что \$YOBA и \$Yoba это два
289 разных скаляра, не забывайте об этом! Тащемта скаляр --- это просто
290 именованный кусочек памяти, в котором программа хранит свои данные.
292 Теперь мы знаем достаточно и можем использовать скаляры. Давайте
293 сохраним в скаляр какое-нибудь значение:
295 \begin{verbatim}
296 $foo = 12345679;
297 \end{verbatim}
299 Что мы видим? Во-первых скаляр \$foo. Затем идёт оператор присваивания. Очень
300 важно не путать оператор присваивания „=” с оператором равенства „==”. В
301 данном случае, значок „=” говорит: „Скаляр \$foo устанавливается равным
302 12345679”. 12345679 в данном примере является константой. Константа зашивается в
303 программу, ей нельзя присваивать значение, её нельзя изменить. Но это, мне
304 кажется, и так понятно. В конце идёт старый добрый символ точки с запятой,
305 завершающий операцию присваивания.
307 Давайте поподробней остановимся на операциях. Операция есть какое-либо
308 основное действие, предусмотренное самим языком. Операции бывают унарные
309 (работают с одним значением), бинарные(два значения) и даже тернарные (три
310 значения, разумеется, таких будет только одна). Операции отделяются друг
311 от друга точкой с запятой. В нашем примере используется бинарная операция
312 присваивания. В ней левому значению-операнду (наш скаляр \$foo)
313 присваивается значение, находящееся справа (12345679). Также интересно знать,
314 что Perl игнорирует пробельные символы (пробел, табуляция, перевод строки)
315 везде, где только можно. Поэтому наше присваивание можно записать даже
316 так:
318 \begin{verbatim}
319 $foo
321 12345679
323 \end{verbatim}
325 Давайте теперь запустим такой скрипт:
327 \perl{l03.pl}
329 В выводе мы использовали ранее оговоренное явление интерполяции. Как
330 видно по четвёртой строке, вместо имени скаляра (\$foo) в print подставляется
331 его значение. Но что, если нам нужно вывести идентификатор скаляра, а не
332 его значение? Для этого мы \remph{экранируем} (отключаем) бэкслэшем
333 разыменовывающий префикс \remph{\$} .
335 Как я уже говорил, в скаляре можно хранить не только числа. К примеру:
337 \begin{verbatim}
338 $bar= "SERBIA STRONG!\n";
339 \end{verbatim}
341 Несложно догадаться и о том, какие арифметические операции есть в нашем
342 распоряжении:
344 \begin{verbatim}
345 $baz= 99/2*3+4-5;
346 ++$foo; #аналогично $foo= $foo +1 или $foo+= 1;
347 \end{verbatim}
349 Пояснения требует разве что последняя строчка. В ней с помощью унарной
350 операции значение скаляра \emph{инкрементируется} (увеличивается на
351 единицу). Существует также краткая запись для операции \emph{декремента}
352 (уменьшения на единицу), как ни странно, она выглядит так „\texttt{-\--}”.
354 Инкремент и декремент не так просты как кажутся. Их можно записать в
355 префиксной (до операнда\footnote{Операнд --- аргумент операции. Данные, которые
356 обрабатываются командой}) и постфиксной форме (после операнда). Выбор той
357 или иной формы записи есть дело вкуса, но только в том случае, если
358 инкрементирование/декрементирование не входит в состав других операций.
359 В случае префиксной формы ин(де)кремент выполняется до выполнения
360 операции, при постфиксной форме — после. Пример:
362 \perl{l04.pl}
364 Вики гласит: \remph{Скалярные переменные используются для хранения одиночных
365 значений. Они могут содержать числа, строки и ссылки на другие объекты.
366 Перед именем скалярной переменной необходимо ставить знак доллара ’\$’.
367 Тип скалярной переменной не фиксирован (в отличие от, например, языка
368 Си) и определяется динамически в зависимости от контекста.}
370 Примеры:% рассказать о конкатенации строк, указателях и прочей хуите?
372 \perl{l05.pl}
374 {\large{\textbf{Вопросы для самоконтроля:}}}
376 \begin{enumerate}
377 \item Что такое операция, операнд и оператор?
378 \item Для чего предназначены скаляры?
379 \item Что такое разыменовывающий префикс и идентификатор скаляра?
380 \item Чем отличается префиксная и постфиксная форма записи в унарных
381 операциях?
382 \end{enumerate}
384 {\large{\textbf{Задания к разделу:}}}
386 \begin{enumerate}
387 \item Приведите пример унарных и бинарных операций.
388 \item Найдите в сети информацию о требованиях, предъявляемых к
389 идентификаторам. Какие стили именования переменных существуют? Что такое
390 \remph{верблюжья нотация} ?
391 \item Что будет напечатано на экране после выполнения скрипта? В чём
392 ошибка?
394 \perl{l06.pl}
396 Так уж и быть, дам развёрнутый ответ на первый вопрос. Тем более, что он не
397 вполне очевиден. Как видно, скаляр начинает существовать с момента его
398 первого упоминания, что очень плохо и в будущем мы научимся лечить этот
399 недуг с помощью прагмы strict. Если такому скаляру не присвоить какое-либо
400 значение, его содержимое будет не определено. Числовой эквивалент
401 неопределенного значения равен нулю. Поэтому результатом выражения
402 является ноль. Ответ на второй вопрос найти не трудно, но я подскажу. Perl
403 регистрозависим!
404 \item Напишите 4 способа увеличить значение скаляра на 1 одной
405 операцией. Не выходит? Двадцать отжиманий.
406 \item Обладая знаниями об однострочниках, скалярах и операциях, уже
407 сейчас можно использовать Perl, как калькулятор. Напишите однострочник,
408 приводящий обыкновенную дробь $\frac{355}{113}$ за авторством китайского
409 астронома Цзу Чунчжи, в десятичный вид. Часть какого числа скрывается в
410 данной дроби?
411 \end{enumerate}
413 \subsubsection{Массивы}
415 Ранее мы говорили о скалярах, причем говорили уважительно. Каждый скаляр
416 у нас был индивидуален, со своим уникальным идентификатором. Но такой
417 подход не всегда оправдан. Представьте, что мы хотим обработать книгу и
418 каждую её строчку хорошо бы поместить в отдельный скаляр. Сотни, тысячи
419 скаляров! И каждому нужно придумать имя -- нет пути! Поэтому существуют
420 массивы. Я уже говорил, что у массивов рызыменовывающим префиксом служит
421 собака? Массив похож на тюрьму, где скаляры сидят в камерах под
422 порядковыми номерами, а собака их охраняет :)
424 Ну что ж, давай попробуем наполнить нашу тюрьму арестантами и сделать
425 что-нибудь с одним из них:
427 \perl{l07.pl}
429 В строках 3 и 4 мы задаём список начальных значений для массива. Иначе
430 можно сказать, мы „инициализируем” массив. Строка не помещалась на
431 странице и я разбил её на две, я уже говорил, что перлу плевать на подобные
432 отступы. К имени каждого арестанта был добавлен символ перевода строки,
433 иначе имена склеились бы во время вывода (строка 8). Попробуйте убрать
434 переводы строк и посмотрите, что из этого получится. После присваивания
435 массиву списка арестантов, мы можем обращаться к каждому из них по
436 индексу. Нумерация начинается с нуля, очень важно не забывать об этом! Т.е.
437 после присваивания в нулевой камере находится Юрий Есин, а индекс Ильхама
438 равен трём. Но, по-видимому, 0 вызывает у Юрия неприятные ассоциации,
439 поэтому администрация решила пойти на уступки, поменяв его местами с
440 Ильхамом. Этот процесс простирается с 5й по 7ю строку. В пятой строке мы
441 копируем Ильхама в скаляр с именем \$temp. В шестой строке Юрий Есин
442 переезжает из нулевой камеры в третью, тем временем стирая с лица земли
443 клон Ильхама, теперь у нас два Юрия! Но это ненадолго, в седьмой строке
444 Ильхам занимает положенное место. Заметьте, что когда речь идёт о
445 конкретном значении массива, рызыменовывающий префикс меняется на знак
446 доллара. Так мы говорим Perl`у, что подразумеваем конкретный скаляр
447 (конкретного зека), а не весь массив. Вот так например можно вывести имя
448 элемента с индексом два:
450 \begin{verbatim}
451 print $jail[2];
452 \end{verbatim}
454 Также существуют отрицательные индексы. Индекс -1 позволяет получить
455 доступ к последнему элементу, -2 к предпоследнему и так далее. Всегда можно
456 узнать размер массива:
458 \begin{verbatim}
459 print $#jail +1 . "\n";
460 \end{verbatim}
462 Кстати, точка осуществляет конкатенацию (склеивание) строк. В переменной
463 \$\#имя\_массива содержится индекс последнего элемента массива. Если
464 прибавить к значению этой переменной единицу, мы получим количество
465 элементов в массиве.
467 Для работы с массивами существует ряд подпрограмм (функций):
469 \begin{itemize}
470 \item push @array значение ; \#Добавить значение в конец массива.
471 \item pop @array; \#Удаляет последний элемент и возвращает его значение.
472 \item unshift @array; \#добавляет элемент в начало массива.
473 \item shift @array; \#удаляет первый элемент и возвращает его значение.
474 \end{itemize}
476 Что значит \remph{возвращает} ? Любой оператор, любая подпрограмма в
477 Perl что-то возвращает. Возвращаемое значение можно использовать или
478 игнорировать, но оно есть:
480 \perl{l08.pl}
482 В данном примере интерпретатор встречает имя подпрограммы \remph{pop}. Она
483 удаляет последний элемент массива (Ильхам Зюлькорнеев) и возвращает его
484 значение. Т.е. подставляет на место своего вызова. После того, как pop
485 сделает своё дело, она как бы подставит в строку 5 вместо \remph{pop(@jail)}
486 удалённый ранее элемент. Мы могли никак не отреагировать на возвращаемое
487 значение, но в данном случае оно пригодилось. В строке 6 выводится
488 значение последнего элемента, теперь можно видеть, что крайний у нас
489 Владимир Дерюжкин.
491 Кстати! Если элемент не должен содержть пробелов, можно воспользоваться
492 специальной конструкцией \remph{qw()} , которая аналогична двойным кавычкам,
493 при этом, она сама расставляет запятые, что экономит время.
495 Пример:
497 \begin{verbatim}
498 @a= qw(Один Два Три 4 5 6 7);
499 \end{verbatim}
501 \subsubsection{Хэши}
503 Хэши --- тоже массивы, только ассоциативные. От обычных массивов они
504 отличаются тем, что элементы в них не упорядочены; получать значение
505 элемента нужно не по индексу, а по \emph{ключу}. На самом деле хэши --- вещь
506 очень удобная, просто к ней нужно привыкнуть. Разыменовывающий префикс
507 для хэшей таков \remph{\%} . Также справедливо правило, гласящее: когда мы
508 обращаемся к конкретному элементу, необходимо менять разыменовывающий
509 префикс на \remph{\$} . Пример:
511 \perl{l09.pl}
513 Во второй сроке мы говорим интерпретатору, что хотим использовать модуль
514 „POSIX\footnote{POSIX читается, как позикс -- позитив. Переносимый интерфейс
515 операционных систем Unix}”. В этом модуле определена нужная нам
516 подпрограмма \remph{ceil} , которая округляет дробь до большего целого. В
517 строках 4-6 парами \emph{ключ => значение}\footnote{Оператор \remph{=>}
518 ведёт себя, как обыкновенная запятая, но автоматически заключает в кавычки
519 значение, стоящее слева}
520 инициализируется хэш. Perl игнорирует пробельные
521 символы\footnote{К пробельным символам относятся пробел, табуляция и перевод
522 строки} , поэтому я разбиваю оператор на несколько строк для наглядности.
523 В строке девять мы считываем в скаляр строку с клавиатуры. Строка
524 считывается до тех пор, пока пользователь не нажмет ввод (\emph{Enter}, перевод
525 строки). Но нажатый ввод тоже записывается в нашу строку в виде символа
526 перевода строки, его нужно удалить. Это приходится делать так часто, что
527 существует специальная функция из 10й строки. \remph{chomp} удаляет пробельный
528 символ из конца переданной ему строки. В нашем случае, строка -- это
529 содержимое скаляра \emph{\$country} . О вводе/выводе мы поговорим более подробно
530 позднее. Особый интерес представляет 12я строка. В ней мы получаем элемент
531 из хэша по ключу:
533 \begin{verbatim}
534 $pipirka{$country};
535 \end{verbatim}
537 Ключом у нас служит строка, записанная в скаляр \emph{\$country} . Элемент из хэша
538 подставляется на место вызова и тут же попадает в крепкие объятья
539 подпрограммы \emph{ceil} , которая округляет дробь до большего целого и
540 возвращает результат. Возвращенное значение приклеивается к строке \remph{В
541 этой стране } с помощью точки (оператора конкатенации). Затем к
542 получившейся строке дописывается ещё один кусочек \remph{см это
543 роскошь!\textbackslash n}.
545 \subsection {Управляющие конструкции}
546 \subsubsection{Ветвление}
548 \emph{Есть два стула...}
550 \emph{Истина} и \emph{Ложь} --- ключевые понятия в информатике. Ещё в 1666г. Готфрид
551 Вильгельм Лейбниц пытался перевести логику (или, как называл ее Лейбниц,
552 законы мышления) из словесного царства, полного неопределенностей, в
553 царство математики, где отношения между объектами или высказываниями
554 определяются совершенно точно. К сожалению, на тот момент применения этим
555 трудам Лейбница не нашлось, но оно нашлось позже. Огромный вклад в
556 становление \remph{Алгебры Логики} внёс Джордж Буль, поэтому часто сей
557 предмет так и называют \remph{Булевой Алгеброй} . К счастью, для понимания
558 многих вещей нам достаточно самых основ, освоить которые может любой
559 школьник. Первое основное понятие --- это \remph{Логическое высказывание} .
561 \begin{itemize}
562 \item \emph{Логическое высказывание} — утверждение, о котором всегда можно
563 однозначно сказать, истинно оно или ложно.
564 \end{itemize}
566 Эта однозначность всегда меня завораживала. Ведь логические
567 высказывания --- это одна из немногих вещей, в истинности которых не
568 приходится сомневаться. Это успокаивает. Примеры высказываний:
570 \begin{itemize}
571 \item Пять больше двух : ИСТИНА
572 \item Абу --- админ сайта со смешными картинками : ИСТИНА
573 \item В неделе три дня : ЛОЖЬ
574 \end{itemize}
576 Теперь нам нужно строгое определение Истины и Лжи. Не будем лезть в
577 философию, достаточно чисто технической точки зрения. Приведу цитату от
578 автора Perl’а:
580 \begin{em}
581 Что же такое "истина"и "ложь"? В Perl эти правила несколько странноваты, но,
582 тем не менее, дают ожидаемые результаты. Управляющее выражение
583 вычисляется как строковая величина в скалярном контексте (если это уже
584 строка, ничего не изменяется, а если это число, то оно преобразуется в
585 строку*). Если данная строка либо пуста (т.е. имеет нулевую длину), либо
586 состоит из одного символа "0"(цифры нуль), то значение выражения — "ложь".
587 Все остальное автоматически дает значение "истина". Почему же в Perl столь
588 забавные правила? А потому, что это облегчает условный переход не только
589 по нулю (в противоположность ненулевому числу), но и по пустой (в
590 противоположность непустой) строке, причем без необходимости создания
591 двух версий интерпретируемых значений "истина"и "ложь". Вот несколько
592 примеров интерпретации этих значений.
594 \begin{itemize}
595 \item 0 \# преобразуется в "0 поэтому "ложь"
596 \item 1-1 \# дает в результате 0, затем преобразуется в "О поэтому "ложь"
597 \item 1 \# преобразуется в "1 поэтому "истина"
598 \item \# пустая строка, поэтому "ложь"
599 \item "1"\# не или "0 поэтому "истина"
600 \item "00" \# не или "0 поэтому "истина"(это странно, поэтому будьте настороже)
601 \item "0.000"\# "истина"— будьте внимательны, по той же причине
602 \item undef \# дает в результате , поэтому "ложь"
603 \end{itemize}
604 \end{em}
606 Если проще: „Истина --- это любое значение, не равное нулю”. Примеры
607 истинных значений в Perl:
609 \begin{itemize}
610 \item "ALLO YOBA\textbackslash n"
611 \item -1
612 \item 2
613 \item 555
614 \item 0.1
615 \end{itemize}
617 Неопределенное значение преобразуется в ноль и поэтому оно ложно.
618 Например, если сделать так:
620 \begin{verbatim}
621 $foo;
622 \end{verbatim}
624 В скаляре \remph{\$foo} будет содержаться ложное значение, ибо значение его не
625 определено.
627 Как же заставить Perl принимать решения? Для этого существует специальная
628 конструкция:
630 \perl{l10.pl}
632 После ключевого слова \remph{if} в скобках записывается выражение, истинность
633 которого проверяется. Если выражение истинно, выполняется блок
634 операторов в первых фигурных скобхах (с 2 по 4ю строки). Если же выражение
635 ложно, вместо первого блока выполняется блок, идущий после ключевого
636 слова \remph{else}. Второй блок необязателен и строки с 5-8 можно не писать. В
637 этом случае оператор ветвления ничего не сделает, если выражение ложно.
639 Очень часто приходится проверять несколько условий, для этого есть
640 специальная конструкция:
642 \begin{verbatim}
643 if (условие1)
645 #операторы, если условие1 истинно
647 elsif (условие2)
649 # операторы, если истинно условие 2
651 else
653 # Операторы на случай, если оба условия ложны
655 \end{verbatim}
657 В богатом арсенале Perl есть ещё одно спецсредство, \remph{unless} :
659 \begin{verbatim}
660 unless(условие)
662 #операторы
664 \end{verbatim}
666 В данном случае блок операторов будет выполнятся, если условие ложно.
667 Закрепим пройденный материал примером:
669 \perl{l11.pl}
671 До сих пор мы проверяли только простые условия; чтоб начать использовать
672 более сложные, необходимо освоить логические операции. Есть три основных
673 логических операции:
675 \begin{itemize}
676 \item НЕ — логическое отрицание
677 \item ИЛИ — логическое сложение
678 \item И — логическое умножение
679 \end{itemize}
681 В перле \remph{НЕ} выглядит так: \remph{not} . Инвертирует значение логического
682 выражения. Истина становится ложью, а ложь истиной. \remph{ИЛИ} в перле
683 представляется ключевым словом \remph{or} . Операция бинарная, сравнивает два
684 логических значения, в итоге получается истина, если хотя бы одно из
685 значений истинно. Примеры:
687 \begin{itemize}
688 \item 1 or 0 - ИСТИНА
689 \item 1 or 1 - ИСТИНА
690 \item 0 or 0 - ЛОЖЬ
691 \end{itemize}
693 \remph{И} - логическое умножение, в перле представлена ключевым словом \remph{and}
694 . Ложно, если хотя бы одно из условий ложно:
696 \begin{itemize}
697 \item 1 and 0 - ЛОЖЬ
698 \item 0 and 1 - ЛОЖЬ
699 \item 1 and 1 - ИСТИНА
700 \end{itemize}
702 В Perl также существует короткая форма записи на случай, если не хочется
703 громоздить фигурные скобки. Суть такова:
705 \begin{verbatim}
706 оператор ключевое_слово логическое_выражение;
707 \end{verbatim}
709 Пример:
711 \begin{verbatim}
712 print "ТОЛЬКО МОЛОДОСТЬ!\n" if $bus == 359;
713 \end{verbatim}
715 Кстати, символы сравнения:
716 \begin{itemize}
717 \item == равно
718 \item != не рано
719 \item > больше
720 \item < меньше
721 \item <= меньше или равно
722 \item >= больше или равно
723 \end{itemize}
725 Завершая теоретическую часть, расскажу о таком интересном приёме, как
726 короткозамкнутость. В погоне за производительностью создатели
727 интерпретаторов просекли, что, например, если левая часть выражения \remph{И}
728 ложна, то нет смысла вычислять правую. В результате будет ложь. В случае с
729 \remph{ИЛИ} нет смысла считать правую часть, если левая истинна. Чтоб стало
730 понятней, улучшим описанный ранее листинг:
732 \perl{l12.pl}
734 Если в хэше нет страны, имя которой ввел пользователь, приложение
735 завершается с выводом сообщения. \remph{die} занимается именно завершением
736 скриптов на случай „нештатных” ситуаций, выводя сообщение, которое ей
737 передают в качестве параметра.
739 В 12й строке представлена так называемая \remph{постфиксная} запись
740 оператора ветвления. Условие записывается после оператора, но смысл от
741 этого не меняется. Вначале проверится условие и, в зависимости от
742 результата, оператор слева выполнится/не выполнится. Кстати, unless лучше
743 использовать только в простой (постфиксной) форме, сложные условия в unless
744 читать трудно, запомните это и постарайтесь избегать таких решений.
745 Оператор \remph{exists} возвращает логическое значение, говорящее о
746 существовании элемента с данным ключом в хэше. Этот оператор позволяет
747 избежать проблем преобразования. Например, если стереть \remph{exists} и ввести
748 „Амазония”, хэш вернёт значение ноль, которое будет преобразовано в
749 ложь, и это несмотря на то, что значение с таким ключом существует!
751 Как видите, я не использую кавычки для ключей (Россия, Эстония и т.д.), так
752 как оператор \remph{=>} автоматически заключает левый операнд в кавычки.
754 \subsubsection{Циклы}
756 Циклы --- важнейшая вещь в программировании. Компьютеры существуют в том
757 числе и для того, чтоб лентяй мог свалить на них тупую рутину. А циклы как % ошибка?
758 раз этим и занимаются. К тому же, циклы обычно идут рука об руку с
759 массивами.
761 Итак, циклы --- это конструкция, которая выполняет некоторые действия
762 до тех пор, пока условие цикла выполняется. Делаем вывод:
764 \begin{enumerate}
765 \item У цикла есть условие
766 \item Также у него есть тело --- блок операторов, который будет выполняться,
767 пока условие цикла истинно.
768 \item Цикл однажды должен завершиться. Тут два стула: либо условие станет
769 ложным, либо мы повалим его насильственно.
770 \end{enumerate}
772 Сразу к делу. Первым циклом, который мы рассмотрим, будет \remph{while}. На
773 русский это ключевое слово переводится, как „пока” или ,скорее, „до тех
774 пор, пока”. Синтаксис:
776 \begin{verbatim}
777 while(условие)
779 #делаем что-то полезное, пока условие истинно
781 \end{verbatim}
783 Пример:
785 \perl{l13.pl}
787 В листинге скаляр \emph{\$i} используется в качестве счетчика. В строке 6 мы
788 проверяем условие "счетчик меньше или равен индексу последнего элемента
789 массива?". Если да --- очередной элемент выводится на экран и значение
790 счетчика увеличивается на единицу. Важный момент: если забыть увеличить
791 счетчик --- скрипт \emph{зациклится}.
793 Напоминаю, что любое выражение в Perl можно рассматривать как логическое
794 значение. Поэтому можно написать такой фрагмент кода:
796 \begin{verbatim}
797 while($i= pop @porn_stars)
799 print "$i\n";
801 \end{verbatim}
803 \emph{pop} будет удалять по одному элементу из массива, удалённые элементы
804 присваиваются скаляру \emph{\$i} и затем выводятся на экран. Когда элементов в
805 массиве не останется, \emph{pop} вернёт 0, а ноль суть ложь --- цикл прервется.
807 Очень хорошим примером будет вычисление числа $\pi$ по формуле Валлиса:% вообще тут должено быть \dotsm, но мне лень это подключать
809 $$\frac{2}{1}\cdot\frac{2}{3}\cdot\frac{4}{3}\cdot\frac{4}{5}\cdot\frac{6}{5}\cdot\frac{6}{7}
810 \cdot\frac{8}{7}\cdot\frac{8}{9}\dotsc = \frac{\pi}{2}$$
812 Формула не самая эффективная. $\pi$ уточняется достаточно долго. Пример:
814 \perl{l14.pl}
816 Скаляр \remph{\$e} указывает, до каких пор может увеличиваться числитель.
817 Возможно, стоит уменьшить значение \remph{\$e} , иначе тело цикла совершит 250
818 миллионов проходов\footnote{повторения цикла частенько называют итерациями.
819 Запомните этот термин, он очень распространён.} , мой компьютер затратил
820 на всё около 5 минут и вычислил число $\pi$ с точностью до восьмого
821 десятичного знака. С 3 по 7 строку мы задаём начальные значения
822 (инициализируем) скалярам, которые будут использоваться в цикле. Скаляр
823 \remph{\$a} используется в качестве счетчика. В строке 9 мы проверяем, не
824 превысил ли скаляр \remph{\$a} значение, хранящееся в \remph{\$e} , если так ---
825 завершаем цикл. Очень важно, чтоб цикл когда-нибудь завершался, иначе
826 скрипт \remph{зациклится} . Например, это может произойти , если программист
827 забудет вставить в цикл код, увеличивающий счетчик. Обратите внимание на
828 сокращённую запись, такая есть для многих операций. Советую запомнить эту
829 фичу, экономит время.
831 Но \remph{while} в предыдущем примере --- не совсем подходящая кандидатура. Для
832 реализации цикла с параметром в Perl есть гораздо более удобная
833 конструкция:
835 \begin{verbatim}
836 for(начальное_значение_параметра; условие; приращение_параметра)
838 #делаем что-то полезное
840 \end{verbatim}
842 А вот и пример:
844 \perl{l15.pl}% я бы приращение назвал изменением.
846 Как видно, теперь у нас всё в одном флаконе. Не нужно задавать начальное
847 значение где-то вне цикла. Инициализация, проверка условия и приращение
848 удобно расположены в одном месте. Кстати, любой из блоков (или все сразу)
849 можно опустить, например:
851 \begin{verbatim}
853 for(;;)
855 #делаем что-то полезно
858 \end{verbatim}
860 Данная конструкция начинает „бесконечный цикл”. В кавычках, т.к.
861 бесконечных циклов быть в принципе не должно. И в этом случае цикл тоже
862 прервется, но насильно, из собственного тела. Для этих целей существует
863 ключевое слово \remph{last} . Встретив его, интерпретатор выходит из текущего
864 цикла. Примером у нас будет реализация алгоритма \remph{быстрого поиска} в
865 массиве. Чем он отличается от простого перебора всех элементов? Обычный
866 поиск \remph{в лоб} :
868 \perl{l16.pl}
870 Здесь нам приходится делать проверку дважды. Во-первых, мы проверяем
871 счётчик на каждой итерации (строка 5), во-вторых, сравниваем каждый элемент
872 с искомым значением (строка 7). Если искомый элемент найден, завершаем цикл
873 с помощью \remph{last} в строке 7. Но мы могли бы обойтись одной проверкой в
874 строке семь. Для этого нужно сделать так, чтоб скрипт в любом случае
875 наткнулся на искомый элемент, для этого добавляем его в конец.
876 Следовательно, если индекс найденного элемента окажется последним
877 индексом массива, будем считать, что массив не содержит данного элемента:
879 \perl{l17.pl}
881 Выигрываем в скорости, но проигрываем в памяти. Ведь ещё один элемент
882 нужно где-то хранить! Больше комментировать нечего. Пример достаточно
883 очевиден.
885 Кроме \remph{last} существуют ещё два оператора для управления циклом:
887 \begin{itemize}
888 \item next — перейти к следующей итерации
889 \item redo — повторить текущую итерацию
890 \end{itemize}
892 Первую вещь я использую очень часто. Например, чтоб пропустить какую-то
893 часть тела цикла на текущем ходу, второй пользовать не приходилось. Если
894 узнаете простой и доступный пример — пишите! Добавлю в книгу!
896 Как я уже говорил, циклы и массивы так тесно связаны, что для обработки
897 массивов существует специальная конструкция \remph{foreach} -- \remph{для каждого} .
898 Синтаксис:
900 \begin{verbatim}
901 foreach текущий_элемент (массив)
903 #делаем что-то полезное
905 \end{verbatim}
907 Данный вид цикла потихонечку перебирает элементы массива один за другим,
908 записывая текущий элемент в скаляр, указанный до скобок. В скобках указан
909 сам массив. Внимание! Если менять значение скаляра, указанное до скобок,
910 изменится и значение соответствующего элемента массива. Перепишем
911 предыдущий пример так:
913 \perl{l18.pl}
915 Думаю, здесь всё очевидно. Цикл переберет все элементы массива и
916 автоматически завершится.
918 Говоря о циклах, думаю стоит упомянуть о такой вещи, как \emph{map} . Этот
919 оператор чем-то напоминает foreach. Он выполняет блок операторов для каждого
920 элемента списка, который ему выдали\footnote{Вообще, map в других языках
921 вызывает функцию поочерёдно на каждом элементе массива и возвращает
922 результат. Более того, map может применять функцию, принимающую несколько
923 аргументов на нескольких массивах -- массив первого, второго аргумента и
924 так далее. Исправить map в Perl поможет функция zip на массивах аргументов.}, но
925 в отличие от чистокровного цикла, map ещё и список возвращает. Этот список
926 можно использовать в корыстных целях. Вот простой пример:
928 \perl{l19.pl}
930 Для каждого элемента массива „@a” выполняется блок операторов в
931 фигурных скобках. Как видно, здесь действуют правила возврата значений из
932 подпрограмм. Возвращается последнее вычисленное значение (которым
933 является скаляр „\$scalar”). Текущий элемент находится в знакомом спец.
934 скаляре „\$\_”. Если его изменить, измениться и соответствующий элемент в
935 массиве „@a”. Но в нашем примере массив „@a” не меняется, зато создается
936 новый массив, содержащий все элементы из „@a”, но в верхнем регистре.
938 \subsection{Генерал Фэйлор. Пара слов об ошибках.}%надо рассказать про REPL
939 %http://stackoverflow.com/questions/73667/how-can-i-start-an-interactive-console-for-perl
941 \begin{em}
942 Программирование сегодня — это гонка разработчиков программ, стремящихся
943 писать программы больше и с лучшей идиотоустойчивостью, и вселенной,
944 которая пытается создавать больших и лучших идиотов. Пока вселенная
945 побеждает.
947 \begin{flushright}
948 Rick Cook
949 \end{flushright}
951 \end{em}
952 %pageref на листинг 13. Можно попробовать автоматически создавать label`ы для листингов.
954 Вернёмся к первому примеру на странице~\pageref{lst:l13.pl} и сотрём оператор инкремента
955 \remph{\$i++} из цикла \remph{while} . Больше \$i не увеличивается, и
956 Perl обречён вечно выводить имя луноликой Саши. Это одна из самых страшных
957 ошибок, а ошибки бывают двух типов:
959 \begin{enumerate}
960 \item Синтаксические
961 \item Логические
962 \end{enumerate}
964 Синтаксическая ошибка --- это, например, пропущенная скобка или забытая
965 точка с запятой. Наткнувшись на такую ошибку, интерпретатор обзовет
966 погромиста дураком и откажется выполнять скрипт. И это очень хорошо!
967 Такие ошибки самые безобидные и их видно сразу. Логические же ошибки
968 намного коварней. Они не противоречат правилам языка, программа
969 собирается без проблем, но ведёт себя не так, как хотелось бы. В нашем
970 случае нетрудно понять, в чем же проблема, но в больших проектах это сущий
971 Ад и Израиль. Недаром до 70\% времени, затраченного на создание программного
972 обеспечения, занимает именно отладка.
974 Конечно можно отлаживать простым путём, всюду втыкая \remph{print} , но в нашем
975 арсенале есть более простое и эффективное средство: \remph{perldebug}~! Давайте
976 попробуем препарировать скрипт, считающий число $\pi$ , который находится
977 на странице~\pageref{lst:l14.pl}. Чтобы начать, достаточно выполнить команду:
979 \begin{verbatim}
980 perl -d pi.pl
981 \end{verbatim}
983 Поздравляю, мы в отладчике! Что дальше? Давайте осмотримся. Вот так можно
984 вывести строки с 5 по 10:
986 \begin{verbatim}
987 l 5-10
988 \end{verbatim}
990 На экран будет выведен фрагмент листинга, каждая строчка которого с
991 любовью пронумерована по порядку. Нас интересуют только строчки, несущие
992 смысловую нагрузку. Таковые после своего номера обозначены двоеточием.
993 Теперь давайте укажем интерпретатору, что на шестой строке нужно будет
994 сделать привал\footnote{Другими словами, при запуске программы,
995 интерпретатор остановится на этой строке и будет ждать наших дальнейших
996 указаний. Удобно в случае, если нам хочется не прослеживать ход работы
997 программы с самого начала, а выяснить работу конкретного куска кода.
998 Точка, где мы прикажем отладчику остановиться, называется \emph{точкой
999 останова} (Breakpoint)}:
1001 \begin{verbatim}
1003 \end{verbatim}
1005 Отлично. Начнём отладку командой \remph{r} . Скрипт начнёт выполняться и
1006 остановится на 6й строке. Теперь можно с помощью команды \remph{p} посмотреть
1007 значение какого-либо скаляра. Например:
1009 \begin{verbatim}
1010 p $e
1011 \end{verbatim}
1013 Теперь можно, например, выполнять строку за строкой, нажимая \remph{s} или
1014 продолжить выполнение до следующей точки останова (если она есть) введя
1015 \remph{c} . Кстати, если нужно выполнить предыдущую команду, достаточно просто
1016 нажать enter. Для удаления точки останова, на которой сейчас находимся,
1017 необходимо нажать \remph{d} , для удаления вообще всех точек останова -- \remph{D}.
1018 Чтобы выйти из отладчика, необходимо ввести \remph{q} . На этом остановимся.
1019 Отладчик Perl -- вещь мощная, о нём есть даже целая книга. Поэтому google в
1020 помощь!
1022 \subsubsection{Константы}
1024 \begin{em}
1025 Я уехал, я уехал в Петербург,\\
1026 А приехал в Ленинград.
1027 \begin{flushright}
1028 --- Борис Моисеев и Людмила Гурченко\\
1029 „Петербург --- Ленинград”
1030 \end{flushright}
1031 \end{em}
1033 Неожиданный финал, не правда ли? Чтобы подобные неприятности не
1034 случались, некоторые вещи должны оставаться неизменными. Любовь мамы и
1035 верность родине. Поэтому, сейчас мы будем говорить о константах. Тем
1036 более, что, судя по CPAN\footnote{Comprehensive Perl Archive Network, хранилище библиотек кода на
1037 Perl. Более подробно см. раздел ``Карп в пакете''}, программистам на Perl их явно
1038 недостаёт. Но я не буду рассказывать о сторонних модулях, гораздо
1039 полезней знать о том, что у нас всегда под рукой. Итак, несколько
1040 \textbf{ВАНИЛЬНЫХ}\footnote{Под „ванильными” я подразумеваю средства, входящие
1041 в стандартную поставку Perl} способов задания констант на Perl.
1043 \perl{l20.pl}
1045 Но у констант данного типа есть существенные недостатки. Они не
1046 интерполируемы, ведь у них отсутствует разыменовывающий префикс. А еще их
1047 нельзя использовать, как ключ хэша.
1049 Начиная с версии 5.8, можно сделать скаляр константным вот так:
1051 \begin{verbatim}
1052 Internals::SvREADONLY($RO_SCALAR => 1);
1053 \end{verbatim}
1055 Теперь при попытке изменить значение \$RO\_SCALAR интерпретатор прекратит
1056 выполнение скрипта с сообщением об ошибке. А с помощью команды:
1058 \begin{verbatim}
1059 Internals::SvREADONLY($RO_SCALAR => 0);
1060 \end{verbatim}
1062 Мы снова делаем скаляр доступным для записи. Преимущество данного метода
1063 в том, что работа с подобными „константами” ничем не отличается от
1064 работы со скаляром.
1066 А вот ещё один способ. Старый, как сам перл:
1068 \begin{verbatim}
1069 *PI = \3.14159265358979323;
1070 \end{verbatim}
1072 Теперь можно писать:
1074 \begin{verbatim}
1075 print "$PI\n";
1076 \end{verbatim}
1078 В данном случае мы используем значения типа typeglob (запись таблицы
1079 символов). Это ещё один тип данных в Perl, о котором мы когда-нибудь
1080 поговорим более подробно. Я обещаю. А пока я позволю себе отмазаться
1081 словами Ларри: „То чего ты не знаешь, не может навредить. Во всяком случае,
1082 сильно.”
1084 Зачем вообще нужны эти ваши константы?
1086 \begin{enumerate}
1087 \item Исчезает необходимость помнить конкретные числа — имена
1088 запоминаются легче;
1089 \item Ошибки в именах обычно выявляются компилятором автоматически;
1090 \item Упростился процесс внесения изменений: значение константы задано
1091 в программе всего в одном месте.
1092 \end{enumerate}
1094 Если коротко, константы гораздо информативней, чем
1095 „магические числа”\footnote{Магическими числами называют плохую практику
1096 программирования, когда в исходном тексте встречается числовое значение
1097 и не очевидно, что оно означает.} , плюс они делают программу более
1098 безопасной и переносимой.
1100 \subsubsection{Нерушимые хэши}
1102 Слава strict! Теперь мы не можем создать скаляр, просто опис\'{а}вшись,
1103 но сохранить данные не по тому ключу хэша можем, ещё как. Недавно,
1104 подобная ошибка стоила мне целого сундука нервов. Но даже если вас
1105 съели, есть как минимум два выхода! Поэтому use Hash::Util, Luke.
1107 В принципе, здесь: http://perldoc.perl.org/Hash/Util.html%\url{http://perldoc.perl.org/Hash/Util.html}
1108 всё подробно описано. Но я опишу самые „вкусные” функции:
1110 \begin{enumerate}
1111 \item lock\_keys/unlock\_keys --- запрещает/разрешает добавлять новые
1112 ключи в переданный хэш. Но ключи по-прежнему можно удалить.
1113 \item lock\_value/unlock\_value --- запрещает/разрешает изменять
1114 значение переданного ключа, но не запрещает его удаление.
1115 \item lock\_hash/ulock\_hash --- Радикальные функции. Делают хэш
1116 полностью константным. Ничего нельзя изменить или удалить.
1117 \end{enumerate}
1119 Нехитрые приёмы, описанные в данном разделе, способны сэкономить
1120 кучу времени и нервов. Пользуйтесь на здоровье!