Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 [ 129 ] 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242

# Рекурсия no левому потомку,

# рекурсия по правому потомку

# и вывод текущего значения, sub post order {

my($tree) = (а , return unless $tree, post order($tree->{LEFT}), post order($tree->{RlGHT}), print $tree->{VALUE},

# Функция определяет, присутствует ли передаваемое значение в дереве

# Если значение присутствует, функция возвращает соответствующий узел

# Поиск ускоряется за счет ограничения перебора нужной ветвью sub search {

my($tree, Svalue) = (a , return unless Stree, If ($tree->{VALUE} == Svalue) { return Stree,

search($tree->{ (Svalue < $tree->{VALUE}) > LEFT RIGHT}, Svalue)

Пример 11.1 (продолжение)

# Вывод текущего значения,

# рекурсия по левому потомку

# и рекурсия по правому потомку sub pre order {

iDy($tree) = <s> , return unless $tree, print $tree->{VALUE}, , pre order($tree->{LEFT}), pre Qrder($tree->{RIGHT}),



Пакеты, библиотеки

и модули


Как и асе обладатели библиотек, Аурелиап сознавал свою вину за то, что он недостаточно хорошо зисьч ее содержимое.

Хорхе Луис Бор.хес, «Теологии-

Введение

Представьте, что у вас есть две программы, каждая из которых хорошо работает сама по себе. Возникает идея - создать третью программу, объединяющую лучп1ие свойства первых двух. Вы копируете обе программы в иовьи! файл и начинаете перемещать фрагменты. Выясняется, что в программах встречаются переменные и функции с одинаковыми именами, которые невозможно объединить. Например, каждая программа может содержать функцию init или глобальную пе-ремс]И1ую $count. При объединении эти компоненты вступают в конфликт.

Проблема решается с номоихью пакетов. Пакеты используются в Perl для разделения глобального пространства имен. Они образуют основу как для традиционных модулей, так и для объектно-ориентированных классов. Подобно тому, как каталог содержит файлы, пакет содержит идентификаторы. Каждый глобальный рщеити4)икатор (переменная, функция, манипулятор файла или каталога, формат) состоит из двух частей: hmcihi пакета и собственно идентификатора. Эти две части ра.зделяются символами : .. Например, переменная $CGI. . needs binmode представляет собой глобальную переменную с именем $needs binmode, принадлежащую пакету CGI (до выхода версии 5.000 для этой цели иснользовался апостроф - на-прн.мер, $CGI needs bin mode). Переменная $Names: : startup - это переменная Sstartup пакета Names, а $Dates;: startup - переменная $startup пакета Dates. Идентификатор $startup без и.мени пакета означает глобальную переменную Sstartup текущего пакета (при условии, что в данный момент не видна лексическая переменная Sstartup; о лексических переменных рассказано в главе 10 «Поднрограм-.мы»). При указании неполного 1ьмени (то есть имени переменной без пакета) лексические неременные переопределяют глобальные. Лексическая переменная существует в области действия; глобальная - на уровне пакета. Если вам нужна глобальная переменная, укажите ее полное имя.



Ключевое слово package является объявленР1ем, обрабатываемым на стадии компиляции. Оно устанавливает префикс пакета по умолчанию для неполных глобальных идентификаторов, по аналогии с тем, как chdir устанавливает префикс каталога по умолчанию для относительных путей. Влияние package распространяется до конца текущей области действия (блока в фигурных скобках, файла или eval) или до ближайшей команды package в той же области действия (см. следующий фрагмент). Все программы выполняются в пакете mam, пока командой package в них не будет выбран другой пакет.

package Alpha; Sname = "first";

package Omega; Sname = "last";

package main;

print "Alpha is SAlpha;;name, Omega is SOmega;:name.\n"; Alpha is first. Omega is last.

В отличие от пользовательских идентификаторов, встроенные переменные со специальными именами (например, $ и $.) и идентификаторы STDIN, STDOUT, STDERR, ARGV, ARGVOUT, ENV, INC и SIG без указания имени пакета считаются принадлежащими к пакету main. Благодаря этому STDIN, @ARGV, %ENV и $ всегда означают одно и то же независимо от текущего пакета; например, @ARGV всегда относится к @main: ;ARGV, даже если вы измените пакет по умолчанию командой package. Уточненное имя @ElseWhere: : ARGV относится к нестандартному массиву @ARGV и не обладает специальным значением. Не забудьте локализовать переменную если вы используете ее в своем модуле.

Модули

Многократное использование кода в Perl осуществляется с помощью модулей. Модуль представляет собой файл, содержащий набор взаимосвязанных функций, которые используются другими программами и библиотечными модулями. У каждого модуля имеется внешний интерфейс - набор переменных и функций, предназначенных для использования за его пределами. Внутри модуля интерфейс определяется инициализацией некоторых пакетных переменных, с которыми работает стандартный модуль Exporter. За пределами модуля доступ к интерфейсу организуется посредством импортирования имен, что является побочным эффектом команды use. Внешний интерфейс модуля Perl объединяет все, что документировано для всеобщего применения. К недокументированному интерфейсу относится все, что не предназначено для широкой публики. Говоря о модулях в этой главе и о традиционных модулях вообще, мы имеем в виду модули, использующие Exporter.

Команды require и use подключают модуль к вашей программе, хотя и обладают несколько разной семантикой. Команда require загружает модуль во время выполнения с проверкой, позволяющей избежать повторной загрузки модуля.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 [ 129 ] 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242