Анимация
JavaScript
|
Главная Библионтека 1.1. Работа с подстроками 29 # Получить 5-байтовую строку, пропустить 3, # затем две 8-байтовые строки, затем все остальное (Sleading, $s1, $s2, $trailing) = unpack{"A5 x3 A8 A8 A*", $data); # Деление на группы из пяти байт (afivers = unpack("A5" х {length{$string)/5), Sstring); # Деление строки на отдельные символы (achars = unpackCAI" х (length{Sstring), Sstring); Комментарий в отличие от многих языков, в которых строки представлены в виде массива байтов (или символов), в Perl они относятся к базовым типам да1тых. Это означает, что для работы с отдельными символами или подстроками применяется функция unpack или substr. Второй аргумент функции substr (смещение) определяет начало интересующей вас подстроки; положительные значения отсчитываются от начала строки, а отрицательные - с конца. Если смещение равно О, подстрока начинается с начала. Третий аргумент определяет длину подстроки. Sstring = "This IS what you have"; и +012345678901234567890 Прямое индексирование (слева направо) # 109876543210987554321- Обратное индексирование (слева направо) О соответствует 10, 20 и т. д $first = substr(Sstring, О, 1); # "Т" Sstart = substr(Sstring, 5, 2); # "is" Srest = substr(Sstring, 13); » "you have" Slast = substr(Sstring, -1); # "e" Send = substr($string, -4); ft "have" Spiece = substr($string, -8, 3), в "you" Однако функция substr позволяет не только просматривать части строки, по и изменять их. Дело в том, что substr относится к экзотической категории левостео-ронних функций, то есть таких, которым при вызове можно присвоить значение. К тому же семейству относятся функции vec, pos и keys (начиная с версии 5.004). При некоторой фантазии функции local и ту также можно рассматривать как левосторонние. Sstring = "This is what you have"; print Sstring; This is what you have substr($string, 5, 2) = "wasnt"; # заменить "is" на "wasnt" This wasnt what you have substr($string, -12) = "ondrous"; # "This wasnt wondrous" This wasnt wondrous substr($string, 0, 1) = ""; # Удалить первый символ his wasnt wondrous substr($string, -10) = , # Удалить последние 10 символов his wasn Применяя оператор = в сочетании с операторами s /, m или tr /, можно заставить их работать только с определенной частью строки: # =~ применяется для поиска по шаблону if {substr($string, -10) =" /pattern/) { print Pattern matches in last 10 characters\n, # подставить "at" вместо is, ограничиваясь первыми пятью символами substr($string, О, 5) =" s/is/at/g, Более того, подстроки даже можно поменять местами, используя с каждой стороны присваивания несколько вызовов substr: # Поменять местами первый и последний символ строки $а = make а hat , (substr($a,0,1), substr($a,-1)) = (substr($a,-1), substr($a,0,1)); print $a, take a ham Хотя функция unpack не является левосторонней, она работает значительно быстрее substr, особенно при одновременном извлечении нескольких величин. В отличие от subst г она не поддерживает непосредственные смещетгя. В.место этого символ х нижнего регистра с числом пропускает заданное количество байт в прямом направлении, а символ X верхнего регистра - в обратном паправлетти. # Извлечение подстроки функцией unpack $а = То be or not to be , $b = unpack( x6 A6 , $a), # Пропустить 6 символов, прочитать 6 символов print $b; or not {$b, $c) = unpack( x6 A2 X5 A2, $a), # Вперед 6, прочитать 2, # назад 5, прочитать 2 print $b\n$c\n"; Иногда строка «режется» на части в определенных позициях. Предположим, вам захотелось установить позиции разреза перед символами 8, 14, 20, 26 и 30 - в каждом из перечисленных столбцов начинается новое иоле. В принципе можно вычислить форматную строку unpack - А7 А6 А6 А4 А*", но программист па Perl по природе ленив и не желает попусту напрягаться. Пусть за него работает Perl. Воспользуйтесь приведенной ниже функцией cut2fmt\ sub cut2fmt { my(@positions) = (5i , my Stemplate = , my Slastpos = 1, foreach $place(positions) { Stemplate = A ($place - $lastpos) "; 1.2. Выбор значения по умолчанию 31 Slastpos = Splace; Stemplate = "А.; return Stemplate; Stmt = cut2fnt{8, 14, 20, 25, 30); print "Sfmt\n", A7 A6 A6 A6 A4 A* Возможности функции unpack выходят далеко за пределы обычной обработки текста. Она также обеспечивает преобразование между текстовыми и двоичными данными. [> Смотри также- Описание функци1"1 unpack и substr в perlfunc(l); подпрограмма cut2fmt из рецепта 1.18. Применение unpack для двоичных данных демонстрируется в рецепте 8.18. 1.2. Выбор значения по умолчанию Проблема Требуется закрепить за скалярной нерсмепиой значение но умолчанию, по лишь в том случае, если оно пе было задано ранее. Довольно часто требуется, чтобы стандартное значение переменной жестко кодировалось в программе, но его можно было переопределить из командной строки или переменной окружения. Решение Воспользу11тссь оператором или =, работающим как со строками, так и с числами: # Использовать Sb, если значение Sb истинно, и Sc в противном случае $а = $Ь II Sc, П Присвоить $х значение $у, но лишь в том случае, # если $х не является истинной $х I1= $у, Если ваша переменная может принимать 31шчения О или "О", воспользуйтесь функцией defined: # Использовать $Ь, если значение Sb определено, и Sc в противном случае $а = defined(Sb) $b $с, Комментарий Главное отличие между этими двумя приемами (defined и ) состоит, прежде всего, в том, что именно проверяется - определенность или истинность. В мире Perl три определенных значения являются ложными: О, "О" и "". Если ваша нере-менпая содержит одну из этих величин, но вы пе хотите изменять ее, 11 пе подой- 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 |