В Perl, как вы упаковываете хеш и распаковываете его обратно в исходное состояние? - PullRequest
2 голосов
/ 18 февраля 2012

Я хочу сохранить хэш в виде упакованной строки в БД, я получаю часть пакета нормально, но у меня возникла проблема с возвращением хеша

тестового хэша

my $hash = {

   test_string   => 'apples,bananas,oranges',
   test_subhash  => { like => 'apples' },
   test_subarray => [ red, yellow, orange ]

}

Я подумал, что, возможно, я мог бы использовать JSON: XS, как в в этом примере , чтобы преобразовать хэш в строку json и затем упаковать строку JSON ...

Мысли об этом подходе

Ответы [ 4 ]

5 голосов
/ 18 февраля 2012

Storable способен очень точно хранить структуры Perl.Если вам нужно помнить, что что-то является слабой ссылкой и т. Д., Вам нужен Storable.В противном случае я бы избегал этого.

JSON ( Cpanel :: JSON :: XS ) и YAML - хороший выбор.

  • У вас могут возникнуть проблемы, еслиВы сохраняете что-то, используя одну версию Storable, и пытаетесь получить это, используя более раннюю версию.Это означает, что все машины, которые обращаются к базе данных, должны иметь одну и ту же версию Storable.
  • Cpanel :: JSON :: XS быстрее, чем Storable.
  • Быстрый модуль YAML, вероятно, быстрее, чем Storable.
  • JSON не может хранить объекты, но YAML и Storable могут.
  • JSON и YAML читаются человеком (ну, для некоторых людей).
  • JSON и YAML простыанализировать и генерировать на других языках.

Использование:

my $for_the_db = encode_json($hash);
my $hash = decode_json($from_the_db);

Я не знаю, что вы подразумеваете под "упаковкой".Строка, созданная с помощью Cpanel :: JSON :: XS encode_json, может быть сохранена как есть в поле BLOB, а строка, сгенерированная Cpanel::JSON::XS->new->encode, может быть сохранена как есть в поле TEXT.

4 голосов
/ 18 февраля 2012

Вы можете захотеть дать моду Storable.

Он может:

  • хранить ваш хэш (ref) в виде строки сfreeze
  • thaw это во время поиска
3 голосов
/ 18 февраля 2012

Существует много разных способов сохранить структуру данных в скаляре, а затем «восстановить» ее обратно в исходное состояние.У каждого есть свои преимущества и недостатки.

Поскольку вы начали с JSON, я покажу вам пример использования.

use JSON;
my $hash = {

   test_string   => 'apples,bananas,oranges',
   test_subhash  => { like => 'apples' },
   test_subarray => [ red, yellow, orange ]

}

my $stored = encode_json($hash);

my $restored = decode_json($stored);

Сохраняемость, как уже было предложено, также является хорошимидея.Но это может быть довольно странно.Здорово, если вы просто хотите, чтобы ваш собственный скрипт / система сохранял и восстанавливал данные, но помимо этого, это может быть неприятно.Даже передача данных между различными операционными системами может вызвать проблемы.Было рекомендовано использовать заморозку, и для большинства локальных приложений это правильный вызов.Если вы решили использовать Storable для отправки данных на несколько компьютеров, вместо этого обратите внимание на использование nfreeze.

При этом существует масса методов кодирования, которые могут обрабатывать «хранение» структур данных.Посмотрите на YAML или XML.

1 голос
/ 18 февраля 2012

Я не совсем уверен, что вы подразумеваете под "преобразованием хеша в строку JSON, а затем упаковкой строки JSON". Какая дальнейшая «упаковка» требуется? Или вы имели в виду «хранение»?

Существует несколько альтернативных способов хранения хэшей в базе данных.

Как предположил Заид, вы можете использовать Storable до freeze и thaw ваш хэш. Вероятно, это будет самый быстрый метод (хотя вам следует сравнить с данными, которые вы используете, если скорость критична). Но Storable использует двоичный формат, который не читается человеком, что означает, что вы сможете получить доступ к этому полю только с помощью Perl.

Как вы и предлагали, вы можете хранить хеш в виде строки JSON. Преимущество JSON заключается в том, что он достаточно удобочитаем для человека, и есть библиотеки JSON для большинства языков, что облегчает доступ к полю вашей базы данных из чего-то другого, кроме Perl.

Вы также можете переключиться на документно-ориентированную базу данных, такую ​​как CouchDB или MongoDB , но это гораздо больший шаг.

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