perl json yaml

¿Debo usar YAML o JSON para almacenar mis datos de Perl?



(7)

Como con la mayoría de las cosas, depende . Creo que si quieres velocidad e interoperabilidad (con otros idiomas), usa JSON, en particular JSON::XS .

Si quiere algo que los módulos de Perl solo usarán alguna vez, quédese con YAML. Es mucho más común encontrar módulos Perl en CPAN que admitan la descripción de datos con YAML, o que dependan de YAML, que JSON.

Tenga en cuenta que no soy una autoridad y esta opinión se basa en gran medida en la corazonada y la conjetura. En particular, no he perfilado JSON :: XS frente a YAML::XS . Si soy ofensivamente ignorante, solo puedo esperar que haga que alguien se enoje lo suficiente como para aportar información útil a la discusión corrigiéndome.

He estado usando el formato YAML con un éxito razonable en los últimos 6 meses más o menos.

Sin embargo, la implementación pura de Perl del analizador YAML es bastante inquietante para escribir a mano un archivo legible y tiene (en mi opinión) peculiaridades molestas como requerir una nueva línea al final del archivo. También es tremendamente lento en comparación con el resto de mi programa.

Estoy reflexionando sobre la próxima evolución de mi proyecto, y estoy considerando usar JSON en su lugar (un subconjunto más estricto de YAML, como se ve después). ¿Pero qué formato tiene la mayor tracción y esfuerzo comunitario en Perl?

¿Cuál parece ser hoy el mejor formato a largo plazo para la descripción simple de datos en Perl, YAML o JSON, y por qué?


La implementación pura de Perl YAML (módulo YAML en oposición a YAML::Syck ) parece tener algunos problemas serios. Recientemente me encontré con problemas en los que no podía procesar documentos YAML con líneas muy largas (32k caracteres más o menos).

YAML puede almacenar y cargar variables bendecidas y lo hace de forma predeterminada (El fragmento de abajo se copió de un búfer *sepia-repl* en 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'' )

Esto es bastante aterrador desde el punto de vista de la seguridad porque los datos no confiables se pueden usar para llamar a cualquier método DESTROY que se haya definido en su aplicación, o cualquiera de los módulos que utiliza.

El siguiente programa breve demuestra el problema:

#!/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 no permite esto por defecto: es posible serializar "objetos" de Perl, pero para hacerlo, debe definir los métodos TO_JSON.


Se trata de la legibilidad humana, si esta es su principal preocupación, elija 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" ] }


Si está considerando la notación de objetos JavaScript, ¿por qué no utiliza la "notación de objetos 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]}


También es posible que desee considerar el uso de Storable . Es probable que obtengas un impulso de velocidad muy bueno con él. Las compensaciones son:

  • el formato Storable es binario y no legible como JSON o YAML
  • Storable no es un módulo de Perl puro (si eso importa)

Utilizo YAML para rastrear el estado de los procesos porque puedo leer YML en el medio del proceso. Usted (técnicamente) necesita documentos completamente formados para leer XML o JS. YAML es bueno para el seguimiento de estado porque puede escribir muchos miniprogramas en un archivo. De lo contrario, generalmente voy con XML o JS. Buen resumen de pros y contras de arriba, por cierto.


YAML vs JSON es algo muy poco resuelto en Perl, y debo admitir que tiendo a estar en el medio de eso. Te aconsejaría que cualquiera de los dos te proporcionará tanta tracción comunitaria. Tomaría la decisión en función de los diversos pros y contras de los formatos. Desglose las diversas opciones de serialización de datos, por ejemplo (voy a ir al wiki de la comunidad para que la gente pueda agregarle):

YAML Pros

  • Amigable con los humanos, la gente escribe YAML básico sin siquiera saberlo
  • Cadenas WYSIWYG
  • Expresivo (tiene la naturaleza TMTOWDI)
  • Sistema expandible de tipo / metadatos
  • Tipos de datos compatibles con Perl
  • Portátil
  • Familiar (una gran parte de la sintaxis en línea y de cadena se parece al código de Perl)
  • Buenas implementaciones si tiene un compilador (YAML :: XS)
  • Buena capacidad para volcar datos de Perl
  • Uso compacto del espacio de la pantalla (es posible, puede formatear para encajar en una línea)

YAML Contras

  • Gran especificación
  • Implementaciones Perl puras no confiables / incompletas
  • Los espacios en blanco como sintaxis pueden ser polémicos.

JSON Pros

  • Lectura / escritura humana
  • Pequeña especificación
  • Buenas implementaciones
  • Portátil
  • Sintaxis Perlish
  • YAML 1.2 es un superconjunto de JSON
  • Uso compacto del espacio de la pantalla
  • Tipos de datos amistosos Perl
  • Muchas cosas manejan JSON

JSON Contras

  • Las cadenas no son WYSIWYG
  • Sin capacidad de expansión
  • Algunas estructuras de Perl deben expresarse ad-hoc (objetos y globs)
  • Falta de expresividad

XML Pros

  • Uso extendido
  • Sintaxis familiar para los desarrolladores web
  • Gran corpus de buenos módulos XML
  • Schemas
  • Tecnologías para buscar y transformar los datos
  • Portátil

Contras XML

  • Tedioso para que los humanos lean y escriban
  • Estructuras de datos ajenas a Perl
  • Falta de expresividad
  • Gran especificación
  • Verboso

Perl / Data :: Dumper Pros

  • Sin dependencias
  • Sorprendentemente compacto (con las banderas correctas)
  • Perl amigable
  • Puede descargar prácticamente cualquier cosa (a través de DDS )
  • Expresivo
  • Uso compacto del espacio de la pantalla
  • Cadenas WYSIWYG
  • Familiar

Perl / Data :: Dumper Contras

  • No portátil (a otros idiomas)
  • Inseguro (sin medidas heroicas)
  • Inescrutable para programadores que no son de Perl

Storable Pros

  • ¿Compacto? (No tiene números para respaldarlo)
  • ¿Rápido? (No tiene números para respaldarlo)

Cons almacenables

  • Humano hostil
  • Incompatible en todas las versiones almacenables
  • No portátil (a otros idiomas)