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

I often use perl "hierarchical data structures" which consist of multi-level hashes of hashes of things as a way to initialize and drive algorithms. One of the pitfalls of this approach is that it's easy to specify a structure which runs afoul of the assumptions of the code. Because of this, I find I write little ad hoc "structure checkers" which first check the structure for validity against my assumptions.

It finally occurred to me that what I need is some way in perl to specify a compact grammar, and then execute a checker: check ($grammar, $structure), and have it output a useful error pointing to the part of the structure which fails the check.

One has tools that do this, for example, for XML (e.g. schema validity checker).

I'm guessing someone has thought of this ages ago and there is some cool library that does this for perl structures. It's best if the solution is tailored specifically to perl structures, and is simple, rather than using some external, generalized grammar tool.

  • Comment on "Schema" specifier for perl in memory structures

Replies are listed 'Best First'.
Re: "Schema" specifier for perl in memory structures
by mirod (Canon) on Apr 16, 2009 at 14:02 UTC

    Oddly enough, just this morning RJBS was writing about rx aka Data::Rx, which I think tries to do what you want. And if it doesn't, then the blog post mentions a couple more options, JSON Schema and Kwalify that I don't know much about.

      rx looks perfect for this sort of stuff. Very light and very easy to learn.
Re: "Schema" specifier for perl in memory structures
by dHarry (Abbot) on Apr 16, 2009 at 14:29 UTC

    I'm very much an XML monk, whenever I read grammar/structure I tend to go for an XML approach. Of course it can be overkill..., it does give you rich ways of defining your own languages/grammars and validate them with standard tools. It's not easy to match that kind of functionality.

    Some pointers that might be of help to do it non-XML:
    Data::Schema (and related modules) and Data::Validate::XSD (don't be mislead by the XML-ish name)

    HTH
    dHarry