Должен ли я использовать YAML или JSON для хранения данных Perl?

Я использую формат YAML с разумным успехом за последние 6 месяцев или около того.

Однако чистая реализация Perl анализатора YAML справедлива суетливый, чтобы вручную написать читаемый файл и, по-моему, раздражающие причуды, такие как требование новой строки в конце файла. Это также гигантский медленный по сравнению с остальной частью моей программы.

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

Что представляется сегодня лучшим долгосрочным форматом для простых данных в Perl, YAML или JSON и почему?

Ответ 1

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

YAML Pros

  • Дружелюбный человек, люди пишут основной YAML, даже не зная об этом.
  • строки WYSIWYG
  • Выразительный (имеет характер TMTOWDI)
  • Расширяемая система типов/метаданных
  • Типы данных, совместимые с Perl
  • Портативный
  • Знакомый (много синтаксиса inline и string выглядит как Perl-код)
  • Хорошие реализации, если у вас есть компилятор (YAML:: XS)
  • Хорошая возможность сброса данных Perl
  • Компактное использование пространства экрана (возможно, вы можете отформатировать его в одну строку)

YAML Cons

JSON Pros

  • Возможность чтения/записи на человека
  • Малая спецификация
  • Хорошие реализации
  • Портативный
  • Синтаксис Perlish
  • YAML 1.2 является надмножеством JSON
  • Компактное использование экранного пространства
  • Perl дружественные типы данных
  • Много вещей обрабатывают JSON

JSON Cons

  • Строки не WYSIWYG
  • Без расширяемости
  • Некоторые структуры Perl должны быть выражены ad-hoc (объекты и глобусы).
  • Отсутствие выразительности

Преимущества XML

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

Недостатки XML

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

Perl/Data:: Dumper Pros

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

Perl/Data:: Dumper Cons

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

Сохраняемые профи

  • Компактный? (у вас нет номеров для резервного копирования)
  • Быстро? (у вас нет номеров для резервного копирования)

Сохраняемые минусы

  • Человеческое враждебное
  • Несовместим с сохраняемыми версиями
  • Не переносимый (на другие языки)

Ответ 2

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

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

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

Ответ 3

Все о человеческой удобочитаемости, если это ваша главная проблема, выберите YAML:

YAML:

american:
  - Boston Red Sox
  - Detroit Tigers
  - New York Yankees
national:
  - New York Mets
  - Chicago Cubs
  - Atlanta Braves

JSON:

{
  "american": [
    "Boston Red Sox", 
    "Detroit Tigers", 
    "New York Yankees"
  ], 
  "national": [
    "New York Mets", 
    "Chicago Cubs", 
    "Atlanta Braves"
  ]
}

Ответ 4

Реализация YAML pure-Perl (модуль YAML в отличие от YAML::Syck), похоже, имеет некоторые серьезные проблемы. Я недавно столкнулся с проблемами, когда он не мог обрабатывать документы YAML с очень длинными строками (32 тыс. Символов или около того).

YAML может хранить и загружать блаженные переменные и делает это default (фрагмент ниже был скопирован из буфера *sepia-repl* в Emacs):

I need user feedback!  Please send questions or comments to [email protected]
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 Методы.

Ответ 5

если вы рассматриваете Обозначение объекта JavaScript, почему бы не использовать "Perl Object Notation"?

JSON:

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

Perl:

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

Ответ 6

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

  • Сохраняемый формат двоичный и не читаемый человеком, как JSON или YAML
  • Storable не является чистым модулем Perl (если это имеет значение)

Ответ 7

Я использую YAML для отслеживания состояния процессов, потому что я могу прочитать YML в середине процесса. Вы (технически) нуждаетесь в полностью сформированных документах для чтения XML или JS. YAML хорош для отслеживания статуса, потому что вы можете написать много мини-документов в файл. В противном случае я обычно использую XML или JS. Хорошее резюме плюсов и минусов выше, кстати.