| =pod |
| |
| =for comment |
| DO NOT EDIT. This Pod was generated by Swim v0.1.46. |
| See http://github.com/ingydotnet/swim-pm#readme |
| |
| =encoding utf8 |
| |
| =head1 NAME |
| |
| YAML - YAML Ain't Markup Language™ |
| |
| =head1 VERSION |
| |
| This document describes L<YAML> version B<1.24>. |
| |
| =head1 NOTE |
| |
| This module has been released to CPAN as L<YAML::Old>, and soon YAML.pm will |
| be changed to just be a frontend interface module for all the various Perl |
| YAML implementation modules, including YAML::Old. |
| |
| If you want robust and fast YAML processing using the normal Dump/Load API, |
| please consider switching to L<YAML::XS>. It is by far the best Perl module |
| for YAML at this time. It requires that you have a C compiler, since it is |
| written in C. |
| |
| If you really need to use this version of YAML.pm it will always be available |
| as YAML::Old. |
| |
| The rest of this documentation is left unchanged, until YAML.pm is switched |
| over to the new UI-only version. |
| |
| =head1 SYNOPSIS |
| |
| use YAML; |
| |
| # Load a YAML stream of 3 YAML documents into Perl data structures. |
| my ($hashref, $arrayref, $string) = Load(<<'...'); |
| --- |
| name: ingy |
| age: old |
| weight: heavy |
| # I should comment that I also like pink, but don't tell anybody. |
| favorite colors: |
| - red |
| - green |
| - blue |
| --- |
| - Clark Evans |
| - Oren Ben-Kiki |
| - Ingy döt Net |
| --- > |
| You probably think YAML stands for "Yet Another Markup Language". It |
| ain't! YAML is really a data serialization language. But if you want |
| to think of it as a markup, that's OK with me. A lot of people try |
| to use XML as a serialization format. |
| |
| "YAML" is catchy and fun to say. Try it. "YAML, YAML, YAML!!!" |
| ... |
| |
| # Dump the Perl data structures back into YAML. |
| print Dump($string, $arrayref, $hashref); |
| |
| # YAML::Dump is used the same way you'd use Data::Dumper::Dumper |
| use Data::Dumper; |
| print Dumper($string, $arrayref, $hashref); |
| |
| =head1 DESCRIPTION |
| |
| The YAML.pm module implements a YAML Loader and Dumper based on the YAML 1.0 |
| specification. L<http://www.yaml.org/spec/> |
| |
| YAML is a generic data serialization language that is optimized for human |
| readability. It can be used to express the data structures of most modern |
| programming languages. (Including Perl!!!) |
| |
| For information on the YAML syntax, please refer to the YAML specification. |
| |
| =head1 WHY YAML IS COOL |
| |
| =over |
| |
| =item YAML is readable for people. |
| |
| It makes clear sense out of complex data structures. You should find that YAML |
| is an exceptional data dumping tool. Structure is shown through indentation, |
| YAML supports recursive data, and hash keys are sorted by default. In |
| addition, YAML supports several styles of scalar formatting for different |
| types of data. |
| |
| =item YAML is editable. |
| |
| YAML was designed from the ground up to be an excellent syntax for |
| configuration files. Almost all programs need configuration files, so why |
| invent a new syntax for each one? And why subject users to the complexities of |
| XML or native Perl code? |
| |
| =item YAML is multilingual. |
| |
| Yes, YAML supports Unicode. But I'm actually referring to programming |
| languages. YAML was designed to meet the serialization needs of Perl, Python, |
| Ruby, Tcl, PHP, Javascript and Java. It was also designed to be interoperable |
| between those languages. That means YAML serializations produced by Perl can |
| be processed by Python. |
| |
| =item YAML is taint safe. |
| |
| Using modules like Data::Dumper for serialization is fine as long as you can |
| be sure that nobody can tamper with your data files or transmissions. That's |
| because you need to use Perl's C<eval()> built-in to deserialize the data. |
| Somebody could add a snippet of Perl to erase your files. |
| |
| YAML's parser does not need to eval anything. |
| |
| =item YAML is full featured. |
| |
| YAML can accurately serialize all of the common Perl data structures and |
| deserialize them again without losing data relationships. Although it is not |
| 100% perfect (no serializer is or can be perfect), it fares as well as the |
| popular current modules: Data::Dumper, Storable, XML::Dumper and Data::Denter. |
| |
| YAML.pm also has the ability to handle code (subroutine) references and |
| typeglobs. (Still experimental) These features are not found in Perl's other |
| serialization modules. |
| |
| =item YAML is extensible. |
| |
| The YAML language has been designed to be flexible enough to solve it's own |
| problems. The markup itself has 3 basic construct which resemble Perl's hash, |
| array and scalar. By default, these map to their Perl equivalents. But each |
| YAML node also supports a tagging mechanism (type system) which can cause that |
| node to be interpreted in a completely different manner. That's how YAML can |
| support object serialization and oddball structures like Perl's typeglob. |
| |
| =back |
| |
| =head1 YAML IMPLEMENTATIONS IN PERL |
| |
| This module, YAML.pm, is really just the interface module for YAML modules |
| written in Perl. The basic interface for YAML consists of two functions: |
| C<Dump> and C<Load>. The real work is done by the modules L<YAML::Dumper> and |
| L<YAML::Loader>. |
| |
| Different YAML module distributions can be created by subclassing YAML.pm and |
| YAML::Loader and YAML::Dumper. For example, YAML-Simple consists of |
| YAML::Simple YAML::Dumper::Simple and YAML::Loader::Simple. |
| |
| Why would there be more than one implementation of YAML? Well, despite |
| YAML's offering of being a simple data format, YAML is actually very deep |
| and complex. Implementing the entirety of the YAML specification is a |
| daunting task. |
| |
| For this reason I am currently working on 3 different YAML implementations. |
| |
| =over |
| |
| =item YAML |
| |
| The main YAML distribution will keeping evolving to support the entire YAML |
| specification in pure Perl. This may not be the fastest or most stable module |
| though. Currently, YAML.pm has lots of known bugs. It is mostly a great tool |
| for dumping Perl data structures to a readable form. |
| |
| =item YAML::Tiny |
| |
| The point of YAML::Tiny is to strip YAML down to the 90% that people use most |
| and offer that in a small, fast, stable, pure Perl form. YAML::Tiny will |
| simply die when it is asked to do something it can't. |
| |
| =item YAML::Syck |
| |
| C<libsyck> is the C based YAML processing library used by the Ruby programming |
| language (and also Python, PHP and Pugs). YAML::Syck is the Perl binding to |
| C<libsyck>. It should be very fast, but may have problems of its own. It will |
| also require C compilation. |
| |
| NOTE: Audrey Tang has actually completed this module and it works great and is |
| 10 times faster than YAML.pm. |
| |
| =back |
| |
| In the future, there will likely be even more YAML modules. Remember, people |
| other than Ingy are allowed to write YAML modules! |
| |
| =head1 FUNCTIONAL USAGE |
| |
| YAML is completely OO under the hood. Still it exports a few useful top level |
| functions so that it is dead simple to use. These functions just do the OO |
| stuff for you. If you want direct access to the OO API see the documentation |
| for YAML::Dumper and YAML::Loader. |
| |
| =head2 Exported Functions |
| |
| The following functions are exported by YAML.pm by default. The reason they |
| are exported is so that YAML works much like Data::Dumper. If you don't want |
| functions to be imported, just use YAML with an empty import list: |
| |
| use YAML (); |
| |
| =over |
| |
| =item Dump(list-of-Perl-data-structures) |
| |
| Turn Perl data into YAML. This function works very much like |
| Data::Dumper::Dumper(). It takes a list of Perl data structures and dumps them |
| into a serialized form. It returns a string containing the YAML stream. The |
| structures can be references or plain scalars. |
| |
| =item Load(string-containing-a-YAML-stream) |
| |
| Turn YAML into Perl data. This is the opposite of Dump. Just like Storable's |
| thaw() function or the eval() function in relation to Data::Dumper. It parses |
| a string containing a valid YAML stream into a list of Perl data structures. |
| |
| =back |
| |
| =head2 Exportable Functions |
| |
| These functions are not exported by default but you can request them in an |
| import list like this: |
| |
| use YAML qw'freeze thaw Bless'; |
| |
| =over |
| |
| =item freeze() and thaw() |
| |
| Aliases to Dump() and Load() for Storable fans. This will also allow YAML.pm |
| to be plugged directly into modules like POE.pm, that use the freeze/thaw API |
| for internal serialization. |
| |
| =item DumpFile(filepath, list) |
| |
| Writes the YAML stream to a file instead of just returning a string. |
| |
| =item LoadFile(filepath) |
| |
| Reads the YAML stream from a file instead of a string. |
| |
| =item Bless(perl-node, [yaml-node | class-name]) |
| |
| Associate a normal Perl node, with a yaml node. A yaml node is an object tied |
| to the YAML::Node class. The second argument is either a yaml node that you've |
| already created or a class (package) name that supports a C<yaml_dump()> |
| function. A C<yaml_dump()> function should take a perl node and return a yaml |
| node. If no second argument is provided, Bless will create a yaml node. This |
| node is not returned, but can be retrieved with the Blessed() function. |
| |
| Here's an example of how to use Bless. Say you have a hash containing three |
| keys, but you only want to dump two of them. Furthermore the keys must be |
| dumped in a certain order. Here's how you do that: |
| |
| use YAML qw(Dump Bless); |
| $hash = {apple => 'good', banana => 'bad', cauliflower => 'ugly'}; |
| print Dump $hash; |
| Bless($hash)->keys(['banana', 'apple']); |
| print Dump $hash; |
| |
| produces: |
| |
| --- |
| apple: good |
| banana: bad |
| cauliflower: ugly |
| --- |
| banana: bad |
| apple: good |
| |
| Bless returns the tied part of a yaml-node, so that you can call the |
| YAML::Node methods. This is the same thing that YAML::Node::ynode() returns. |
| So another way to do the above example is: |
| |
| use YAML qw(Dump Bless); |
| use YAML::Node; |
| $hash = {apple => 'good', banana => 'bad', cauliflower => 'ugly'}; |
| print Dump $hash; |
| Bless($hash); |
| $ynode = ynode(Blessed($hash)); |
| $ynode->keys(['banana', 'apple']); |
| print Dump $hash; |
| |
| Note that Blessing a Perl data structure does not change it anyway. The |
| extra information is stored separately and looked up by the Blessed node's |
| memory address. |
| |
| =item Blessed(perl-node) |
| |
| Returns the yaml node that a particular perl node is associated with (see |
| above). Returns undef if the node is not (YAML) Blessed. |
| |
| =back |
| |
| =head1 GLOBAL OPTIONS |
| |
| YAML options are set using a group of global variables in the YAML namespace. |
| This is similar to how Data::Dumper works. |
| |
| For example, to change the indentation width, do something like: |
| |
| local $YAML::Indent = 3; |
| |
| The current options are: |
| |
| =over |
| |
| =item DumperClass |
| |
| You can override which module/class YAML uses for Dumping data. |
| |
| =item LoaderClass |
| |
| You can override which module/class YAML uses for Loading data. |
| |
| =item Indent |
| |
| This is the number of space characters to use for each indentation level when |
| doing a Dump(). The default is 2. |
| |
| By the way, YAML can use any number of characters for indentation at any |
| level. So if you are editing YAML by hand feel free to do it anyway that looks |
| pleasing to you; just be consistent for a given level. |
| |
| =item SortKeys |
| |
| Default is 1. (true) |
| |
| Tells YAML.pm whether or not to sort hash keys when storing a document. |
| |
| YAML::Node objects can have their own sort order, which is usually what you |
| want. To override the YAML::Node order and sort the keys anyway, set |
| SortKeys to 2. |
| |
| =item Stringify |
| |
| Default is 0. (false) |
| |
| Objects with string overloading should honor the overloading and dump the |
| stringification of themselves, rather than the actual object's guts. |
| |
| =item Numify |
| |
| Default is 0. (false) |
| |
| Values that look like numbers (integers, floats) will be numified when loaded. |
| |
| =item UseHeader |
| |
| Default is 1. (true) |
| |
| This tells YAML.pm whether to use a separator string for a Dump operation. |
| This only applies to the first document in a stream. Subsequent documents must |
| have a YAML header by definition. |
| |
| =item UseVersion |
| |
| Default is 0. (false) |
| |
| Tells YAML.pm whether to include the YAML version on the separator/header. |
| |
| --- %YAML:1.0 |
| |
| =item AnchorPrefix |
| |
| Default is ''. |
| |
| Anchor names are normally numeric. YAML.pm simply starts with '1' and |
| increases by one for each new anchor. This option allows you to specify a |
| string to be prepended to each anchor number. |
| |
| =item UseCode |
| |
| Setting the UseCode option is a shortcut to set both the DumpCode and LoadCode |
| options at once. Setting UseCode to '1' tells YAML.pm to dump Perl code |
| references as Perl (using B::Deparse) and to load them back into memory using |
| eval(). The reason this has to be an option is that using eval() to parse |
| untrusted code is, well, untrustworthy. |
| |
| =item DumpCode |
| |
| Determines if and how YAML.pm should serialize Perl code references. By |
| default YAML.pm will dump code references as dummy placeholders (much like |
| Data::Dumper). If DumpCode is set to '1' or 'deparse', code references will be |
| dumped as actual Perl code. |
| |
| =item LoadCode |
| |
| LoadCode is the opposite of DumpCode. It tells YAML if and how to |
| deserialize code references. When set to '1' or 'deparse' it will use |
| C<eval()>. Since this is potentially risky, only use this option if you know |
| where your YAML has been. |
| |
| =item Preserve |
| |
| When set to true, this option tells the Loader to load hashes into YAML::Node |
| objects. These are tied hashes. This has the effect of remembering the key |
| order, thus it will be preserved when the hash is dumped again. See |
| L<YAML::Node> for more information. |
| |
| =item UseBlock |
| |
| YAML.pm uses heuristics to guess which scalar style is best for a given node. |
| Sometimes you'll want all multiline scalars to use the 'block' style. If so, |
| set this option to 1. |
| |
| NOTE: YAML's block style is akin to Perl's here-document. |
| |
| =item UseFold |
| |
| If you want to force YAML to use the 'folded' style for all multiline scalars, |
| then set $UseFold to 1. |
| |
| NOTE: YAML's folded style is akin to the way HTML folds text, except smarter. |
| |
| =item UseAliases |
| |
| YAML has an alias mechanism such that any given structure in memory gets |
| serialized once. Any other references to that structure are serialized only as |
| alias markers. This is how YAML can serialize duplicate and recursive |
| structures. |
| |
| Sometimes, when you KNOW that your data is nonrecursive in nature, you may |
| want to serialize such that every node is expressed in full. (ie as a copy |
| of the original). Setting $YAML::UseAliases to 0 will allow you to do |
| this. This also may result in faster processing because the lookup |
| overhead is by bypassed. |
| |
| THIS OPTION CAN BE DANGEROUS. B<If> your data is recursive, this option |
| B<will> cause Dump() to run in an endless loop, chewing up your computers |
| memory. You have been warned. |
| |
| =item CompressSeries |
| |
| Default is 1. |
| |
| Compresses the formatting of arrays of hashes: |
| |
| - |
| foo: bar |
| - |
| bar: foo |
| |
| becomes: |
| |
| - foo: bar |
| - bar: foo |
| |
| Since this output is usually more desirable, this option is turned on |
| by default. |
| |
| =item QuoteNumericStrings |
| |
| Default is 0. (false) |
| |
| Adds detection mechanisms to encode strings that resemble numbers with |
| mandatory quoting. |
| |
| This ensures leading that things like leading/trailing zeros and other |
| formatting are preserved. |
| |
| =back |
| |
| =head1 YAML TERMINOLOGY |
| |
| YAML is a full featured data serialization language, and thus has its own |
| terminology. |
| |
| It is important to remember that although YAML is heavily influenced by Perl |
| and Python, it is a language in its own right, not merely just a |
| representation of Perl structures. |
| |
| YAML has three constructs that are conspicuously similar to Perl's hash, |
| array, and scalar. They are called mapping, sequence, and string respectively. |
| By default, they do what you would expect. But each instance may have an |
| explicit or implicit tag (type) that makes it behave differently. In this |
| manner, YAML can be extended to represent Perl's Glob or Python's tuple, or |
| Ruby's Bigint. |
| |
| =over |
| |
| =item stream |
| |
| A YAML stream is the full sequence of Unicode characters that a YAML |
| parser would read or a YAML emitter would write. A stream may contain |
| one or more YAML documents separated by YAML headers. |
| |
| --- |
| a: mapping |
| foo: bar |
| --- |
| - a |
| - sequence |
| |
| =item document |
| |
| A YAML document is an independent data structure representation within a |
| stream. It is a top level node. Each document in a YAML stream must begin with |
| a YAML header line. Actually the header is optional on the first document. |
| |
| --- |
| This: top level mapping |
| is: |
| - a |
| - YAML |
| - document |
| |
| =item header |
| |
| A YAML header is a line that begins a YAML document. It consists of three |
| dashes, possibly followed by more info. Another purpose of the header line is |
| that it serves as a place to put top level tag and anchor information. |
| |
| --- !recursive-sequence &001 |
| - * 001 |
| - * 001 |
| |
| =item node |
| |
| A YAML node is the representation of a particular data structure. Nodes may |
| contain other nodes. (In Perl terms, nodes are like scalars. Strings, |
| arrayrefs and hashrefs. But this refers to the serialized format, not the in- |
| memory structure.) |
| |
| =item tag |
| |
| This is similar to a type. It indicates how a particular YAML node |
| serialization should be transferred into or out of memory. For instance a |
| Foo::Bar object would use the tag 'perl/Foo::Bar': |
| |
| - !perl/Foo::Bar |
| foo: 42 |
| bar: stool |
| |
| =item collection |
| |
| A collection is the generic term for a YAML data grouping. YAML has two types |
| of collections: mappings and sequences. (Similar to hashes and arrays) |
| |
| =item mapping |
| |
| A mapping is a YAML collection defined by unordered key/value pairs with |
| unique keys. By default YAML mappings are loaded into Perl hashes. |
| |
| a mapping: |
| foo: bar |
| two: times two is 4 |
| |
| =item sequence |
| |
| A sequence is a YAML collection defined by an ordered list of elements. By |
| default YAML sequences are loaded into Perl arrays. |
| |
| a sequence: |
| - one bourbon |
| - one scotch |
| - one beer |
| |
| =item scalar |
| |
| A scalar is a YAML node that is a single value. By default YAML scalars are |
| loaded into Perl scalars. |
| |
| a scalar key: a scalar value |
| |
| YAML has many styles for representing scalars. This is important because |
| varying data will have varying formatting requirements to retain the optimum |
| human readability. |
| |
| =item plain scalar |
| |
| A plain scalar is unquoted. All plain scalars are automatic candidates for |
| "implicit tagging". This means that their tag may be determined automatically |
| by examination. The typical uses for this are plain alpha strings, integers, |
| real numbers, dates, times and currency. |
| |
| - a plain string |
| - -42 |
| - 3.1415 |
| - 12:34 |
| - 123 this is an error |
| |
| =item single quoted scalar |
| |
| This is similar to Perl's use of single quotes. It means no escaping except |
| for single quotes which are escaped by using two adjacent single quotes. |
| |
| - 'When I say ''\n'' I mean "backslash en"' |
| |
| =item double quoted scalar |
| |
| This is similar to Perl's use of double quotes. Character escaping can be |
| used. |
| |
| - "This scalar\nhas two lines, and a bell -->\a" |
| |
| =item folded scalar |
| |
| This is a multiline scalar which begins on the next line. It is indicated by a |
| single right angle bracket. It is unescaped like the single quoted scalar. |
| Line folding is also performed. |
| |
| - > |
| This is a multiline scalar which begins on |
| the next line. It is indicated by a single |
| carat. It is unescaped like the single |
| quoted scalar. Line folding is also |
| performed. |
| |
| =item block scalar |
| |
| This final multiline form is akin to Perl's here-document except that (as in |
| all YAML data) scope is indicated by indentation. Therefore, no ending marker |
| is required. The data is verbatim. No line folding. |
| |
| - | |
| QTY DESC PRICE TOTAL |
| --- ---- ----- ----- |
| 1 Foo Fighters $19.95 $19.95 |
| 2 Bar Belles $29.95 $59.90 |
| |
| =item parser |
| |
| A YAML processor has four stages: parse, load, dump, emit. |
| |
| A parser parses a YAML stream. YAML.pm's Load() function contains a parser. |
| |
| =item loader |
| |
| The other half of the Load() function is a loader. This takes the information |
| from the parser and loads it into a Perl data structure. |
| |
| =item dumper |
| |
| The Dump() function consists of a dumper and an emitter. The dumper walks |
| through each Perl data structure and gives info to the emitter. |
| |
| =item emitter |
| |
| The emitter takes info from the dumper and turns it into a YAML stream. |
| |
| NOTE: In YAML.pm the parserI<loader and the dumper>emitter code are currently |
| very closely tied together. In the future they may be broken into |
| separate stages. |
| |
| =back |
| |
| For more information please refer to the immensely helpful YAML specification |
| available at L<http://www.yaml.org/spec/>. |
| |
| =head1 YSH - THE YAML SHELL |
| |
| The L<YAML::Shell> distribution provides script called 'ysh', the YAML shell. |
| ysh provides a simple, interactive way to play with YAML. If you type in Perl |
| code, it displays the result in YAML. If you type in YAML it turns it into |
| Perl code. |
| |
| To run ysh, (assuming you installed it along with YAML.pm) simply type: |
| |
| ysh [options] |
| |
| Please read the C<ysh> documentation for the full details. There are lots |
| of options. |
| |
| =head1 BUGS & DEFICIENCIES |
| |
| If you find a bug in YAML, please try to recreate it in the YAML Shell with |
| logging turned on ('ysh -L'). When you have successfully reproduced the bug, |
| please mail the LOG file to the author (ingy@cpan.org). |
| |
| WARNING: This is still B<ALPHA> code. Well, most of this code has been around |
| for years... |
| |
| BIGGER WARNING: YAML.pm has been slow in the making, but I am committed to |
| having top notch YAML tools in the Perl world. The YAML team is close to |
| finalizing the YAML 1.1 spec. This version of YAML.pm is based off of a very |
| old pre 1.0 spec. In actuality there isn't a ton of difference, and this |
| YAML.pm is still fairly useful. Things will get much better in the future. |
| |
| =head1 RESOURCES |
| |
| L<http://lists.sourceforge.net/lists/listinfo/yaml-core> is the mailing list. |
| This is where the language is discussed and designed. |
| |
| L<http://www.yaml.org> is the official YAML website. |
| |
| L<http://www.yaml.org/spec/> is the YAML 1.2 specification. |
| |
| L<http://yaml.kwiki.org> is the official YAML wiki. |
| |
| =head1 SEE ALSO |
| |
| =over |
| |
| =item * L<YAML::XS> |
| |
| =back |
| |
| =head1 AUTHOR |
| |
| Ingy döt Net <ingy@cpan.org> |
| |
| =head1 COPYRIGHT AND LICENSE |
| |
| Copyright 2001-2017. Ingy döt Net. |
| |
| This program is free software; you can redistribute it and/or modify it under |
| the same terms as Perl itself. |
| |
| See L<http://www.perl.com/perl/misc/Artistic.html> |
| |
| =cut |