Это команда perldbmfilter, которую можно запустить в провайдере бесплатного хостинга OnWorks, используя одну из наших многочисленных бесплатных онлайн-рабочих станций, таких как Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS.
ПРОГРАММА:
ИМЯ
perldbmfilter - фильтры Perl DBM
СИНТАКСИС
$ db = связать% hash, 'DBM', ...
$ old_filter = $ db-> filter_store_key (суб {...});
$ old_filter = $ db-> filter_store_value (суб {...});
$ old_filter = $ db-> filter_fetch_key (суб {...});
$ old_filter = $ db-> filter_fetch_value (sub {...});
ОПИСАНИЕ
Указанные выше четыре метода filter_ * доступны во всех поставляемых модулях DBM.
с Perl, а именно DB_File, GDBM_File, NDBM_File, ODBM_File и SDBM_File.
Каждый из методов работает идентично и используется для установки (или удаления) одного DBM.
Фильтр. Единственная разница между ними - это место, где установлен фильтр.
Обобщить:
filter_store_key
Если с помощью этого метода был установлен фильтр, он будет вызываться каждый раз, когда вы
написать ключ к базе данных DBM.
filter_store_value
Если с помощью этого метода был установлен фильтр, он будет вызываться каждый раз, когда вы
записать значение в базу данных DBM.
filter_fetch_key
Если с помощью этого метода был установлен фильтр, он будет вызываться каждый раз, когда вы
прочитать ключ из базы данных DBM.
filter_fetch_value
Если с помощью этого метода был установлен фильтр, он будет вызываться каждый раз, когда вы
прочитать значение из базы данных DBM.
Вы можете использовать любую комбинацию методов от нуля до всех четырех.
Все методы фильтрации возвращают существующий фильтр, если он есть, или undef, если нет.
Чтобы удалить фильтр, передайте ему undef.
В ФИЛЬТР
Когда каждый фильтр вызывается Perl, локальная копия $ _ будет содержать ключ или значение, которое будет
фильтрованный. Фильтрация достигается путем изменения содержимого $ _. Код возврата из
фильтр игнорируется.
An Пример: NULL, прекращение проблемы.
Фильтры DBM полезны для класса задач, в которых вы всегда хочу сделать то же самое
преобразование во все ключи, все значения или и то, и другое.
Например, рассмотрим следующий сценарий. У вас есть база данных DBM, которую вам нужно
поделиться со сторонним приложением C. Приложение C предполагает, что ВСЕ ключи и ценности
завершаются NULL. К сожалению, когда Perl записывает данные в базы данных DBM, он не использует NULL.
завершение, поэтому ваше приложение Perl должно будет само управлять завершением NULL. Когда
вы пишете в базу данных, вам нужно будет использовать что-то вроде этого:
$ hash {"$ key \ 0"} = "$ значение \ 0";
Точно так же необходимо учитывать NULL, когда вы рассматриваете длину
существующие ключи / значения.
Было бы намного лучше, если бы вы могли игнорировать проблему завершения NULL в основном
код приложения и имеет механизм, который автоматически добавляет завершающий NULL ко всем
ключи и значения всякий раз, когда вы пишете в базу данных и удаляете их при чтении
из базы данных. Как я уверен, вы уже догадались, это проблема, которую DBM
Фильтры исправить очень легко.
использовать строго;
использовать предупреждения;
используйте SDBM_File;
используйте Fcntl;
мой% хэш;
мой $ filename = "filter";
отсоединить $ filename;
мой $ db = tie (% hash, 'SDBM_File', $ filename, O_RDWR | O_CREAT, 0640)
or die "Невозможно открыть $ filename: $! \ n";
# Установить фильтры DBM
$ db-> filter_fetch_key (sub {s / \ 0 $ //});
$ db-> filter_store_key (sub {$ _. = "\ 0"});
$ db-> filter_fetch_value (
sub {нет предупреждений "не инициализирован"; s / \ 0 $ //});
$ db-> filter_store_value (sub {$ _. = "\ 0"});
$ hash {"abc"} = "def";
мой $ a = $ hash {"ABC"};
#...
undef $ db;
отвязать% хеш;
В приведенном выше коде используется SDBM_File, но он будет работать с любым из модулей DBM.
Надеюсь, содержимое каждого из фильтров не требует пояснений. Оба "принести"
фильтры удаляют завершающий NULL, и оба «хранящих» фильтра добавляют завершающий NULL.
Другой Пример: Основные is a C внутр.
Вот еще один пример из жизни. По умолчанию, когда Perl записывает в базу данных DBM, он
всегда записывает ключ и значение как строки. Итак, когда вы используете это:
$ hash {12345} = "что-то";
ключ 12345 будет сохранен в базе данных DBM как 5-байтовая строка «12345». если ты
на самом деле хотите, чтобы ключ хранился в базе данных DBM как C int, вам нужно будет использовать
«паковать» при записи и «распаковывать» при чтении.
Вот фильтр DBM, который это делает:
использовать строго;
использовать предупреждения;
используйте DB_File;
мой% хэш;
мой $ filename = "filter";
отсоединить $ filename;
мой $ db = связать% hash, 'DB_File', $ filename, O_CREAT | O_RDWR, 0666,
$ DB_HASH или die "Невозможно открыть $ filename: $! \ N";
$ db-> filter_fetch_key (sub {$ _ = unpack ("i", $ _)});
$ db-> filter_store_key (sub {$ _ = pack ("i", $ _)});
$ hash {123} = "def";
#...
undef $ db;
отвязать% хеш;
В приведенном выше коде используется DB_File, но он снова будет работать с любым из модулей DBM.
На этот раз использовались только два фильтра; нам нужно только манипулировать содержимым
key, поэтому нет необходимости устанавливать какие-либо фильтры значений.
Используйте perldbmfilter онлайн с помощью сервисов onworks.net