2011-08-24 21 views
6

Quiero leer datos de un archivo YAML, pero necesito que se guarde el orden de los elementos.
¿Hay algún módulo en Perl que tenga esta funcionalidad y cómo hacerlo?Conservar orden YAML perl


En respuesta a @mugen Kenichi

he conseguido hacer lo que quiera, pero no creo que esto es una solución razonable.

edad YAML:

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

nueva YAML

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

Si el pedido es relevante, debe usar secuencias en yaml. Repensa tu estructura de datos yaml. –

+0

@mugen kenichi He actualizado la pregunta – bliof

+1

Sí, en realidad es una asignación ordenada como se describe aquí http://www.yaml.org/spec/1.2/spec.html#id2765410 –

Respuesta

6

El YAML spec specifically states que "teclas de mapeo no tienen un orden" y que "en todos los casos donde el orden de nodo es significativa, una secuencia debe ser usado". Para inferir el orden de un mapeo sería en violación de la especificación. El uso de asignaciones ordenadas, como lo menciona mugen, es la solución correcta para preservar el orden.

Si realmente quería, de alguna manera se podría conseguir un analizador YAML para volcar en un Tie::IxHash que preservar el orden ... pero no conozco ningún analizador YAML Perl que le da ese nivel de control. Es posible que pueda hacer algo con YAML::Old::Loader, pero ese no es un muy buen analizador YAML y YAML :: Old :: Loader no está documentado.

Una tercera opción sería utilizar YAML tags (tipos explícitos) para indicar al analizador que cargue sus asignaciones como un tipo especial y luego proporcione la devolución de llamada ... pero incluso entonces es probable que el analizador YAML le proporcione su devolución de llamada con un hash desordenado.

Le sugiero que simplemente cambie el YAML. El objetivo de un lenguaje de datos portátil es que todo el significado semántico sea explícito en el archivo de datos o la especificación, no implícito en un analizador en particular. Las asignaciones ordenadas son una expresión aceptada y compacta de YAML.

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