Сохранение YAML порядка Perl - PullRequest
       5

Сохранение YAML порядка Perl

6 голосов
/ 24 августа 2011

Я хочу прочитать данные из файла YAML, но мне нужно сохранить порядок элементов.Есть ли в Perl модуль с такой функциональностью и как это сделать?


В ответ на @mugen kenichi

Мне удалось сделать то, что я хочу, но я не верю, что это разумное решение.

старый YAML:

foo:
   bar: some value
   baz: other value
qwe:
   bar: yet another value
   baz: again

новый YAML

 -
   foo:
      bar: some value
      baz: other value
 -  
   qwe:
      bar: yet another value
      baz: again

1 Ответ

6 голосов
/ 25 августа 2011

Спецификация YAML конкретно указывает , что «ключи отображения не имеют порядка» и что «в каждом случае, когда порядок узлов является значимым, должна использоваться последовательность».Выводить порядок из сопоставления будет в нарушение спецификации.Использование упорядоченных отображений, как упомянуто mugen, является правильным решением для сохранения порядка.

Если бы вы действительно хотели, вы могли бы каким-то образом заставить синтаксический анализатор YAML выбросить в Tie:: IxHash , который сохранит порядок ... но я не знаю ни одного Perl YAML-парсера, который бы давал вам такой уровень контроля.Возможно, вы могли бы что-то сделать с YAML :: Old :: Loader , но это не очень хороший синтаксический анализатор YAML, и YAML :: Old :: Loader не задокументировано.

Третийможно было бы использовать явные теги YAML (он же типы), чтобы дать парсеру команду загружать ваши отображения как специальный тип, а затем предоставить обратный вызов ... но даже в этом случае, вероятно, синтаксический анализатор YAML предоставит вашобратный вызов с неупорядоченным хешем.

Я бы посоветовал вам просто изменить YAML.Суть переносимого языка данных заключается в том, что все семантическое значение явно в файле данных или спецификации, а не в конкретном синтаксическом анализаторе.Упорядоченные отображения являются приемлемой, компактной идиомой YAML.

- foo:
      bar: some value
      baz: other value
- qwe:
      bar: yet another value
      baz: again
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...