Анимация
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

$name1 = "Топ Christiansen"; $name2 = "Tom Boutell";

$tom1 = $hash{$name1}; tt Получить локальный указатель

$tom2 = $hash{$name2}; # И еще один

print "Two Toming: $tom1 $tom2\n";

ARRAY(0x73048)ARRAY(0x73e4G)

Каждый раз, когда MLDBM извлекает структуру данных из файла DBM, строится новая копия данных. Чтобы сравнить данные, полученные из базы данных MLDBM, необходимо сравнить значения полей этой структуры;

if ($tom1->[0] eq $tom2->[0] && $tom1->[1] eq $tom2->[1]) {

print "Youre having runtime fun with one Tom made two.\n"; } else {

print "No two Toms are ever alike.\n";

Этот вариант эффективнее следующего:

if ($hash{$name1}->[0] eq $hash{$name2}->[0] M # НЕЭФФЕКТИВНО $hash{$name1}->[1] eq $hash{$name2}->[1 ]) { print "Youre having runtime fun with one Tom made two.\n";

} else {

print "No two Toms are ever alike.\n";

Каждый раз, когда в программе встречается конструкция $hash{.. ,}, происходит обращение к DBM-файлу. Приведенный выше неэффективный код обращается к базе данных четыре раза, тогда как код с временными переменными $tom1 и $tom2 обходится всего двумя обращениями.

Текущие ограничения механизма tie не позволяют сохранять или модифицировать компоненты MLDBM напрямую;

$hash{"Tom Boutell"}->[0] = "Poet Programmer"; # НЕВЕРНО

Любые операции чтения, модификации и присваивания для частей структуры, хранящейся в файле, должны осуществляться через временную переменную:

Sentry = $hash{"Tom Boutell"}; # ВЕРНО

Sentry->[0] = "Poet Programmer"; Shash{"Tom Boutell"} = Sentry;

Если MLDBM использует базу данных с ограниченным размером значений (например, SDBM), вы довольно быстро столкнетесь с этими ограничениями. Чтобы выйти из положения, используйте GDBM File или DB File, в которых размер ключей или значений не ограничивается. Предпочтение отдается библиотеке DB File, поскольку она использует нейтральный порядок байтов, что позволяет использовать базу данных в архитектурах как с начальным старшим, так и с начальным младшим байтом.



# . . .

untie %data;

my %data;

tie (%data, MLDBM, $Persistent Store)

or die "Cant tie to $Persistent Store $data{VARIABLE1} = $VARIABLE1; $data{VARIABLE2} = $VARIA3LE2; # . .

untie %data;

Комментарий

Существенное ограничение MLDBM заключается в том, что структуру нельзя дополнить или изменить по ссылке без присваивания временной переменной. Мы сделаем это в простой программе из примера 14.6, присваивая $array ref перед вызовом push. Следующая конструкция просто невозможна:

push(@{$db{$user}}, Sduration);

Прежде всего, этому воспротивится MLDBM. Кроме того, $db{$user} может отсутствовать в базе (ссылка на массив не создается автоматически, как это делалось бы в том случае, если бы хэш %db не был связан с DBM-файлом). Именно по-

> Смотри также-

Документация по модулям Data::Dumper, MLDBM и Storable от CPAN; рецепты 11.13; 14.9.

14.9. Устойчивые данные

Проблема

Вы хотите, чтобы значения переменных сохранялись между вызовами программы.

Решение

Воспользуйтесь модулем MLDBM для сохранения значений между вызовами программы:

use MLDBM DB File;

my ($VARIABLE1,$VARIABLE2);

my $Persistent Store = /projects/foo/data;

BEGIN {

my %data;

tie(%data, MLDBM, $Persistent Store)

or die "Cant tie to $Persistent Store : $!"; $VARIABLE1 = $data{VARIABLE1}: $VARIABLE2 = $data{VARIABLE2};



END

gnat

15.3

tchrist

jules

22,1

tchrist

15.9

gnat

Новые версии MLDBM позволяют выбрать не только модуль для работы с базами данных (мы рекомендуем DB File), но и модуль сериализации (рекомендуем Storable). В более ранних версиях сериализация ограничивалась модулем Data::Dumper, который работает медленнее Storable. Для использования DB File со Storable применяется следующая команда:

use MLDBM qw(DB File Storable);

> Смотри также-

Документация по модулям Data::Dumper, MLDBM и Storable с CPAN; рецепты 11.13; 14.8.

этому мы проверяем exists $db{$iiser перед тем, как присваивать $array ref исходное значение. Мы создаем пустой массив в случае, если он не существовал ранее.

Пример 14.6. mldbm-demo

#!/usr/bin/perl -w

# mldbm demD - применение MLDBM с DB File

use MLDBM "DBJile";

$db = "/tmp/mldbm-array";

tie %db, MLDBM, $db or die "Cant open $db ; $!";

while(<DATA>) { chomp;

(Suser, Sduration) = split(/\s+/, $,); Sarray ref = exists $db{$user} ? Sdb{Suser} : []; push(@Sarray ref, Sduration): Sdb{$user} = Sarray ref;

foreach Suser (sort keys %db) { print "Suser: "; Stotal = 0;

foreach Sduration (@{ Sdb{Suser} )) { print "Sduration "; Stotal += Sduration;

print "($total)\n";



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