From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

NAME

Text::ZPL - Encode and decode ZeroMQ Property Language

SYNOPSIS

# Decode ZPL to a HASH:
my $data = decode_zpl( $zpl_text );
# Encode a HASH to ZPL text:
my $zpl = encode_zpl( $data );
# From a shell; examine the Perl representation of a ZPL document:
sh$ zpl_to_pl my_config.zpl

DESCRIPTION

An implementation of the ZeroMQ Property Language, a simple ASCII configuration file format; see http://rfc.zeromq.org/spec:4 for details.

Exports two functions by default: "decode_zpl" and "encode_zpl". This module uses Exporter::Tiny to export functions, which allows for flexible import options; see the Exporter::Tiny documentation for details.

As a simple example, a ZPL file as such:

# This is my conf.
# There are many like it, but this one is mine.
confname = "My Config"
context
iothreads = 1
main
publisher
subscriber

... results in a structure like:

{
confname => "My Config",
context => { iothreads => '1' },
main => {
subscriber => {
},
publisher => {
}
}
}

decode_zpl

Given a string of ZPL-encoded text, returns an appropriate Perl HASH; an exception is thrown if invalid input is encountered.

(See Text::ZPL::Stream for a streaming interface.)

encode_zpl

Given a Perl HASH, returns an appropriate ZPL-encoded text string; an exception is thrown if the data given cannot be represented in ZPL (see "CAVEATS").

TO_ZPL

A blessed object can provide a TO_ZPL method that will supply a plain HASH or ARRAY (but see "CAVEATS") to the encoder:

# Shallow-clone this object's backing hash, for example:
sub TO_ZPL {
my $self = shift;
+{ %$self }
}

CAVEATS

Not all Perl data structures can be represented in ZPL; specifically, deeply-nested structures in an ARRAY will throw an exception:

# Simple list is OK:
encode_zpl(+{ list => [ 1 .. 3 ] });
# -> list: 1
# list: 2
# list: 3
# Deeply nested is not representable:
encode_zpl(+{
list => [
'abc',
list2 => [1 .. 3]
],
});
# -> dies

Encoding skips empty lists (ARRAY references).

(The spec is unclear on all this; issues welcome via RT or GitHub!)

SEE ALSO

The Text::ZPL::Stream module for processing ZPL piecemeal.

The bundled zpl_to_pl script for examining parsed ZPL.

AUTHOR

Jon Portnoy <avenj@cobaltirc.org>