PLP::Fields - Special hashes for PLP


For your convenience, PLP uses hashes to put things in. Some of these are tied hashes, so they contain a bit magic. For example, building the hash can be delayed until you actually use the hash.

%get and %post

These are built from the key=value&key=value (or key=value;key=value strings in query string and post content. %post is not built if the content type is not application/x-www-form-urlencoded. In post content, the semi-colon is not a valid separator.

%post isn't built until it is used, to speed up your script if you don't use it. Because POST content can only be read once, you can use CGI; and just never access %post to avoid its building.

With a query string of key=firstvalue&key=secondvalue, $get{key} will contain only secondvalue. You can access both elements by using the array reference $get{'@key'}, which will contain [ 'firstvalue', 'secondvalue' ].


This hash combines %get and %post, and triggers creation of %post. POST gets precedence over GET (note: not even the @-keys contain both values).

This hash is built on first use, just like %post.

%cookie, %cookies

This is built immediately, because cookies are usually short in length. Cookies are not automatically url-decoded.

%header, %headers

This is a hash of HTTP headers to accompany the first output. By default it will contain X-PLP-Version to identify the serving module, and Content-Type set to text/html.

If STDOUT has been opened as :utf8, a charset=utf-8 attribute will automatically be added. This will not be possible with FastCGI because FCGI (as of version 0.74) does not support output layers.

Headers can be added and/or changed as long as they have not yet been sent. Underscores in key names are converted to normal minus signs, so you can leave out quotes. The hash is case insensitive: the case used when sending the headers is the one you used first. The following are equal:


If a value contains newlines, the header is repeated for each line:

        $header{Allow} = "HEAD\nGET";  # equivalent to HEAD,GET

For example, to send out a non-HTML text instead of the default HTML:

    $header{content_type} = 'text/plain';
    use open ':std', ':utf8';
    This text should be prefixed by the following header:
        Content-Type: text/plain; charset=utf-8


Juerd Waalboer <>

Current maintainer: Mischa POSLAWSKY <>