Я должен использовать YAML или JSON, чтобы хранить мои данные Perl? [закрытый]

Нет не делайте несуществующих объектов. Можно проверить http://codebetter.com/blogs/karlseguin/archive/2008/04/27/foundations-of-programming-pt-7-back-to-basics-memory.aspx для получения дополнительной информации, но вещи установки в NULL ничего не сделают, кроме грязного код.

46
задан brian d foy 10 December 2009 в 18:13
поделиться

5 ответов

YAML против JSON - это то, что очень не решено в Perl, и я признаю, что склоняюсь к середине этого. Я бы посоветовал вам получить столько же поддержки сообщества. Я бы принял решение на основе различных плюсов и минусов форматов. Я разбиваю различные варианты сериализации данных следующим образом (я собираюсь посетить вики сообщества, чтобы люди могли добавить к нему):

YAML Pros

  • Дружелюбно к людям, люди пишут базовый YAML, даже не подозревая об этом
  • WYSIWYG strings
  • Выразительный (имеет характер TMTOWDI)
  • Расширяемая система типов / метаданных
  • Perl-совместимые типы данных
  • Portable
  • Familiar (многие встроенные и строковые синтаксисы похожи на код Perl)
  • Хорошие реализации, если у вас есть компилятор (YAML :: globs)
  • Недостаточная выразительность

XML Pros

  • Широкое использование
  • Синтаксис, знакомый веб-разработчикам
  • Большой корпус хороших модулей XML
  • Схемы
  • Технологии поиска и преобразования данных
  • Portable

XML Минусы

  • Утомительно для людей читать и писать
  • Структуры данных, чужие для Perl
  • Недостаточная выразительность
  • Большая спецификация
  • Verbose

Perl / Data :: Dumper Плюсы

  • Никаких зависимостей
  • Удивительно компактный (с правильными флагами)
  • Совместимость с Perl
  • Может выгружать практически все (через DDS )
  • Выразительный
  • Компактное использование экранное пространство
  • Строки WYSIWYG
  • Знакомые

Perl / Data :: Dumper Недостатки

  • Непереносимость (на другие языки)
  • Небезопасно (без героических мер)
  • Непостижимо для программистов, не использующих Perl

Плюсы с возможностью хранения

  • Компактность? (дон' нет цифр, подтверждающих это)
  • Быстро? (нет цифр, подтверждающих это)

Сохраняемые недостатки

  • Враждебное отношение к человеку
  • Несовместимость между сохраняемыми версиями
  • Непереносимость (на другие языки)
81
ответ дан 26 November 2019 в 20:15
поделиться

Если вы рассматриваете объектную нотацию JavaScript, почему бы не использовать «объектную нотацию Perl»?

JSON:

{"name": "bob", "parents": {"mother": "susan", "father": "bill"}, "nums": [1, 2, 3]}

Perl:

{name => "bob", parents => {mother => "susan", father => "bill"}, nums => [1, 2, 3]}
1
ответ дан 26 November 2019 в 20:15
поделиться

Вы также можете рассмотреть возможность использования Storable . Скорее всего, вы получите очень хороший прирост скорости. Компромиссы следующие:

  • формат Storable является двоичным и не читается человеком, как JSON или YAML
  • Storable не является чистым модулем Perl (если это имеет значение)
0
ответ дан 26 November 2019 в 20:15
поделиться

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

Если вам нужно что-то, что будет использоваться только модулями Perl, придерживайтесь YAML. Гораздо чаще можно найти модули Perl на CPAN, которые поддерживают описание данных с помощью YAML или которые зависят от YAML, чем JSON.

Обратите внимание, что я не являюсь авторитетом, и это мнение основано в основном на догадках и предположениях. В частности, я не профилировал JSON :: XS и YAML :: XS . Если я оскорбительно невежественен, я могу только надеяться, что заставлю кого-то достаточно разгневанного, чтобы внести полезную информацию в обсуждение, исправив меня.

13
ответ дан 26 November 2019 в 20:15
поделиться

Реализация YAML на чистом Perl (модуль YAML вместо YAML :: Syck ), похоже, имеет серьезные проблемы. default (приведенный ниже фрагмент был скопирован из буфера * sepia-repl * в Emacs):

I need user feedback!  Please send questions or comments to seano@cpan.org.
Sepia version 0.98.
Type ",h" for help, or ",q" to quit.
main @> use YAML
undef
main @> $foo = bless {}, 'asdf'
bless( {}, 'asdf' )
main @> $foo_dump = YAML::Dump $foo
'--- !!perl/hash:asdf {}
'
main @> YAML::Load $foo_dump
bless( {}, 'asdf' )

Это довольно опасно с точки зрения безопасности, потому что могут использоваться ненадежные данные. для вызова любого метода DESTROY , который был определен в вашем приложении - или любой из модулей, которые он использует.

Следующая короткая программа демонстрирует проблему:

#!/usr/bin/perl
use YAML;
use Data::Dumper;
package My::Namespace;
sub DESTROY {
    print Data::Dumper::Dumper \@_;
}
package main;
my $var = YAML::Load '--- !!perl/hash:My::Namespace
bar: 2
foo: 1
';

JSON не допускает этого по умолчанию - можно сериализовать Perl "объекты", но для этого вам нужно определить TO_JSON методы.

4
ответ дан 26 November 2019 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: