Пакет Storable позволяет сохранять сложные структуры данных на диске, в файлы.
Очень удобно, если учесть, что одной из сильных сторон Perl является именно работа с файлами и текстом. В некоторых случаях этот подход может полностью устранить необходимость работы с БД.
Несколько простых примеров работы со Storable. Методы nstore, nstore_fd и lock_nstore в данном тексте не рассматриваются.
Методы store и retrieve
Рабочий пример:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/usr/local/bin/perl use Storable; # методы store и retrieve импортируются автоматически my %hash = ( 'name'=> 'Luchia', 'lang'=> ['perl', 'ruby'], 'interest' => { 'home' => ['cats', 'cook'], 'work' => ['free time'], }, ); # запихиваем сложную структуру в файл store \%hash, 'file.txt'; # получаем структуру из файла my $hashref = retrieve('file.txt'); print $hashref->{name}; exit; |
Методы store_fd и fd_retrieve
Можно использовать вместо прямого обращения к файлу файловые дескрипторы.
Пример записи структуры данных в файл:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#!/usr/local/bin/perl use Storable qw(store_fd); my %hash = ( 'name'=> 'Luchia', 'lang'=> ['perl', 'ruby', 'lua'], 'interest' => { 'home' => ['cats', 'cook'], 'work' => ['free time'], }, ); open FILE, '>file.txt'; store_fd(\%hash, *FILE); close FILE; exit; |
Пример извлечения структуры данных из файла:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/usr/local/bin/perl use Storable qw(fd_retrieve); open FILE, '<file.txt'; my $hashref = fd_retrieve(*FILE); print $hashref->{name}; close FILE; exit; |
Методы lock_store и lock_retrieve
Методы lock_store и lock_retrieve - делают ту же работу, что и методы store и retrieve. Отличие заключается в том, что методы "lock_" блокируют файл от стороннего доступа на время выполнения своей работы.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#!/usr/local/bin/perl use Storable qw(lock_store lock_retrieve); my %hash = ( 'name'=> 'Luchia', 'lang'=> ['perl', 'ruby', 'python'], 'interest' => { 'home' => ['cats', 'cook'], 'work' => ['free time'], }, ); # запихиваем сложную структуру в файл lock_store \%hash, 'file.txt'; # получаем структуру из файла my $hashref = lock_retrieve('file.txt'); print $hashref->{name}; exit; |
Методы freeze и thaw
Storable предоставляет 2 интересных метода: freeze и thaw. На русский это перевести сложно. Если дословно, то получится "заморозка" и "разморозка".
Метод freeze получает хэш и сохраняет его в скалярную переменную, как обычную строку текста. Получившийся блок данных можно куда-нибудь сохранить, передать другому процессу, а в нужный момент применить thaw и восстановить сложную структуру данных.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#!/usr/local/bin/perl use Storable qw(freeze thaw); my %hash = ( 'name'=> 'Luchia', 'lang'=> ['perl', 'ruby', 'python'], 'interest' => { 'home' => ['cats', 'cook'], 'work' => ['free time'], }, ); my $str = freeze(\%hash); my $hash_ref = thaw($str); print $hash_ref->{name}; exit; |
Метод dclone
Метод позволяет осуществлять глубокое (рекурсивное) копирование (или клонирование - как больше нравится) сложных структур данных.
|
1 2 3 4 5 |
use Storable qw(dclone); ... my $cloneref = dclone($hashref); print $cloneref->{name}; |
спасибо, полезная статья