2015-09-24 7 views
5

Ho un documento YAML che contiene i valori booleani:Come conservare il tipo booleano dal documento YAML in Perl 5?

--- 
ok: false 

voglio caricarlo in Perl 5 e preservare il tipo 'booleano' per essere in grado poi di serializzare il documento correttamente per JSON utilizzando true/false valori , non ""/"1".

Il seguente convertitore che ho scritto non riesce a conservare booleani:

#!/usr/bin/env perl 

use strict; 
use warnings; 

use YAML::XS qw<LoadFile>; 
use JSON::MaybeXS(); 

print JSON::MaybeXS->new->ascii->pretty->canonical->encode(LoadFile shift) 

Ecco la (corrotto) Uscita:

{ 
    "fine" : "" 
} 

spero esistono alcuni ganci in qualche YAML caricatore per mappare true/false a JSON::true/JSON::false o $Types::Serialiser::true/$Types::Serialiser::false.

+0

Correlato: https://stackoverflow.com/questions/21461877/perl-yaml-module-does-not-recognize-types-of-scalars – dolmen

risposta

0

Se questo modulo YAML esiste, deve essere piuttosto oscuro. Quello che usi qui, YAML::XS, converte semplicemente valori booleani in dati YAML ai valori interni standard PL_sv_yes e PL_sv_no, e quelli sono (per quanto posso vedere) impossibile da riconoscere come speciali.

Sul lato positivo, sembra piuttosto semplice per correggere YAML::XS per utilizzare Types::Serialiser per booleani e inviare una richiesta di pull.

+0

YAML :: Syck utilizza le stringhe per i booleani, ma penso che YAML :: Il comportamento di XS è probabilmente più corretto, quindi non è un ottimo motivo per cambiare. Vedi la discussione in [YAML :: XS, YAML :: Syck e valori booleani] (http://www.perlmonks.org/?node_id=1046452) su PerlMonks. – ThisSuitIsBlackNot

+0

Direi che il comportamento di YAML :: XS è un bug - non vi è alcun vantaggio nell'applicare & PL_sv_no/yes direttamente nelle strutture (come spiegato sopra), ma interrompono il modello di dati perl: nessuna assegnazione o modifica. Potrei persino creare casi in cui si tratta di un bug di sicurezza, poiché un utente malintenzionato in grado di controllare i dati YAML potrebbe indurre inaspettate eccezioni di runtime, il che significa molto intervento a distanza per i miei gusti. I tipi: i booleani Serialiser possono essere rilevati da Perl e funzionano come gli scalari Perl, cioè possono essere stampati, modificati, sovrascritti e così via. –