http://www.perlmonks.org?node_id=1073672

david2008 has asked for the wisdom of the Perl Monks concerning the following question:

Hi all, I get a yaml file like described here.
When i try to parse it with YAML::Load i get the following error.
YAML Error: Invalid element in map
   Code: YAML_LOAD_ERR_BAD_MAP_ELEMENT
   Line: 4
   Document: 1
Which library is capable of parsing this?
Thanks,
David

Replies are listed 'Best First'.
Re: how do i parse a yaml set with perl ( can't )
by Anonymous Monk on Feb 06, 2014 at 09:58 UTC

    Which library is capable of parsing this?

    None

    YAML is weak :) Re: Loading multiple files with YAML::XS (named streams)

    #!/usr/bin/perl -- use strict; use warnings; use Module::Load qw' load '; use YAML::Any(); my $yaml = q{ # Explicitly typed set. baseball players: !!set ? Mark McGwire ? Sammy Sosa ? Ken Griffey # Flow style baseball teams: !!set { Boston Red Sox, Detroit Tigers, New York Yanke +es } }; MOD_YAML : for my $modYaml ( qw[ YAML::XS YAML::XS::LibYAML YAML::Syck YAML::Old YAML YAML::Tiny ] ){ #~ eval { load $modYaml; 1 } or do { warn $@; next MOD_YAML }; eval { load $modYaml; 1 } or next MOD_YAML; no strict 'refs'; local *Dump = \&{"$modYaml\::Dump"}; local *Load = \&{"$modYaml\::Load"}; local *{"$modYaml\::CompressSeries"} = 0; local *{"$modYaml\::Indent"} = 5; local *{"$modYaml\::UseFold"} = 5; # no visible effect local *{"$modYaml\::UseBlock"} = 1; # 5; # no visible effect, 1 or + 5 print "\n# Using $modYaml\n"; print eval { Dump( Load( $yaml ) ) } || $@; print "\n\n"; }
      Thanks for the quick reply.
      I understand.
      This file is created by a java program using the snakeyaml library. I will ask them to change the set to a hash where the values are 1.

        The order doesn't matter, but the elements are also simple values... why not make it an array?

        If you're making it a hash, then your values are used as the keys of the hash and you have to make up and store dummy values to complete the hash structure. That's confusing and inefficient.

      Could you elucidate on what you did after no strict 'refs' for educational purposes? I preach YAML quite a bit, and while I've heard of problems like what david2008 is having, I've never run up on them because I use the same lib to dump output as I do to process input.

        See YAML::Any, its just old-api way (inspired by Data::Dumper) of specifying formatting options ...

        some never worked, I doubt any of the options works anymore

        its a copy paste from 2009 when ysh disappeared from YAML, and I was seeing what I can see about YAML

        Actually its from 2011 when I took another look at YAML to see if I can roundtrip yaml without changing format; I even went to IRC to ask ingy about it and the answer was no

        Human writable/readable serialization format, great idea
        Uh oh, full spec is so full, its full of full
        Oh boy :) Java is the only language that fully supports the full spec
        Poor humans :) None or very weak editor support
        Damn computers :) No round tripping (what goes out looks nothing like what goes in)
        Awww :) No customizable beautifier ( no Perl::Tidy )

        So great idea, fantastic even, gets upgraded, support never that great, humans not that interested , humans choose JSON, JSON wins

        Maybe when YAML tools improve ten fold, brave folks will look at YAML again, but most will still stick with JSON :)