Анимация
JavaScript
|
Главная Библионтека Строки ..и открыл легкомысленно уста свои, и безрассудно расточает слова. Книга Иова, 35:10 Введение Многие языки програмли1рова1И1я заставляют нас мыслить на неудобном низком уровне. Вам понадобилась строка, а язык хочет, чтобы вы работали с указателем или байтовым массивом. Впрочем, не отчаивайтесь - Perl не относится к языкам низкого уровня, и в нем удобно работать со строками. Perl проектировался для обработки текста. В сущности, в Perl существует такое количество текстовых операций, что их невозможно описать в одной главе. Рецепты обработки текста встречаются и в других главах. В частности, обратитесь к главе 6 «Поиск по шаблону» и главе 8 «Содержимое файлов» - в них описаны интересные приемы, не рассмотренные в этой главе. Фундаментально!! единицей для работы с да!И1ыми в Perl является скаляр (scalar), то есть отдельное значите, храгшщсеся в отдельпо11 (скалярной) неремсп-ной. В скалярных переменных хранятся строки, числа и ссылки. Массивы и хэпди представляют собой соответствеппо списки или ассоциативные массивы скашров. Ссылки используются для косвенных обращений к другим величинам; они отчасти похожи на указатели в языках низкого уровня. Числа обычно хранятся в формате веществишых чисел с двойной точностью. Строки в Perl могут иметь произвольную длину (ограниченную только объелюм виртумьпой памяти вашего компьютера) и содержат произвольные данные - даже двоичные последовательности с нулевыми байтами. Строка не является массивом байт; к отдельному символу нельзя обратиться по индексу, как к элементу массива - для этого следует воспользоваться функцией substr. Строки, как и все типы данных Perl, увеличиваются и уменьшаются в размерах по мере необходимости. Неиспользуемые строки уничтожаются системой сборки мусора Perl (обычно при выходе переменной, содержащей строку, за пределы области действия или после вычисления выраже1шя, в которое входит стро- ка), Иначе говоря, об управлении памятью можно ие беспокоиться - об этом уже позаботились до вас. Сюшярпая величина может быть определенной пли пеоиределенпо1г Определенная величина может содержать строку, число или ссылку. Единственным неопределенным значением является undef, все остальные значения считаются определенными - даже О и пустая строка. Однако определенность не следует путать с логической истиной; чтобы проверить, определена ли некоторая величина, следует воспользоваться функций defined. Логическая истина имеет особое значение, которое проверяется логическими операторалт && и , а также в условии блока while. Две определенные строки считаются ложными: пустая строка ("") и строка единичной длины, содержащая цифру «ноль» ( О"). Возможно, второе вас несколько удивит, но это связано с тем, что Perl выполняет преобразования между числами и строками по мере необходимости, Чнсла 0. 0.00 и 0.00000000 без кавычек считаются ложными значениями, по в строках они становятся истиипыми (так, строка О 00 считается истинной, а не лолаюй). Все остальные определенные значения (например, false", 15 и \$х) истинны. В строковом контексте значение undef интерпретируется как пустая строка ( "). В числовом контексте undef интерпретируется как О, а в ссылочном - как нуль-ссылка. При этом во всех случаях оно считается ложным. Использование пеопре-делеппой величш1Ы там, где Perl ожидает получить определенную, приводит к записи в STDERR предупреждения времени выполнения (если был использован флаг -w). Для простого вопроса о том, является ли нечто истинным или ложным, предупреждение не выдается. Некоторые операции не выдают предупреждений при использовании переменных, содержащих пеонределенные значения. К их числу относятся операции автоматического увеличения и уменьщепия, ++ и --, а также сложение и конкатенация с ирисваиванием, += и =. В программах строки записываются в апострофах или кавычках, в форме q или qq или «встроенных документов» (here-documents). Апострофы используются в простеГшей форме определения строк с минимальным количеством снециаль-ных символов: - завершает строку, \ - вставляет в иее апостроф, а \\ - обратную косую черту; $string = An, й Два символа, \ и п Sstring = Jon \Maddog\ Orwant й Внутренние апострофы В строках, заключенных в кавычки, возможна интерполяция имен переменных (но не вызовов функций - о том, как это делается, см. рецепт 1.10). В них используется множество служебных символов; \п" - символ перевода строки, "\033" - символ с восьмерич1илм кодом 33, "\cJ" - Ctrl-i-J и т. д. Полный список приведен в странице руководства рег/ор(1). Sstring = \п, # Символ перевода строки Sstring = Jon \Maddog\ Orwant , » Внутренние кавычки Операторы q и qq позволяют чередовать разделители строк с апострофами и кавычками. Например, строку с внутренними апострофами проще записать в следующем виде, вместо того чтобы использовать служебные символы \:
Sstring = q/Jon Maddog Orwant/; # Внутренние апострофы В качестве разделителей могут использоваться одинаковые символы, как в этом примере, или парные (для различных типов скобок): (f Внутренние апострофы it Внутренние апострофы (f Внутренние апострофы it Внутренние апострофы Концепция «встроенных документов» позаимствована из командных интерпретаторов (shell) и позволяет определять строки, содержащие большое количество текста. Текст может интерпретироваться по правилам для строк, заключенных в апострофы или кавычки, и даже как перечень исполняемых команд - в зависимости от того, как задается завершающий идентификатор. Например, следующий встроенный документ будет интерпретироваться по правилам для строк, заключенных в кавычки: $а = «"EOF"; This IS а multiline here document terminated by EOF on a line by itself EOF Обратите внимание: после завершающего EOF точка с запятой не ставится. Встроенные документы более подробно рассматриваются в рецепте 1,11, Предупреждение для программистов из других стран: в настоящее время Perl не обладает прямой поддержкой многобайтовых кодировок (в версии 5.006 ожидается поддержка Unicode), поэтому в тексте книги понятия байт и символ считаются идентичными. 1.1. Работа с подстроками проблема Требуется получить или модифицировать не целую строку, а лишь ее часть. Например, вы прочитали запись с фиксированной структурой и теперь хотите извлечь из нее отдельные поля. Решение Функция substr предназначена для чтения и записи отдельных байтов строки: lvalue = substr{$string, Soffset, 4count); Svalue = substr($string, Soffset); substr{$string, Soffset, $count) = Snewstring; substr{$string, Soffset) = Snewtail; Функция unpack ограничивается доступом только для чтения, но при извлечении нескольких подстрок работает быстрее: 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 |