The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
NAME
    variable - Perl pragma to declare (scalar) variables without a leading
    "$".

SYNOPSIS
        use variable  spam  =>  17;
        use variable  eggs  =>  spam + 25;
        use variable "i";            # Makes "i" undefined.
        use variable  arr   =>  [qw /aap noot mies wim zus jet/];

        print eggs, "\n";            # Print 42.
              eggs += 27;
        print eggs, "\n";            # Print 69.

        for (i = 0; defined (arr -> [i]); i ++) {
            print arr -> [i], " ";   # Print aap noot mies wim zus jet.
        }

DESCRIPTION
    This simple module allows you to create scalar variables that do not
    need a leading "$". This will make people coming from a C or a Python
    background feel more at home.

NOTES
    This module requires perl 5.6.0.

    The values given to the variables are evaluated in list context. You may
    wish to override this by using "scalar".

    These variables do not directly interpolate into doublequotish strings,
    although you may do so indirectly. (See the perlref manpage for details
    about how this works.)

        print "The value of eggs is ${\eggs}.\n";

    This only works for scalar variables, not arrays or hashes.

    Naming of variables follow the same rules as in "constant.pm". Names
    must begin with a letter or underscore. Names beginning with a double
    underscore are reserved. Some poor choices for names will generate
    warnings, if warnings are enabled at compile time.

    Variable symbols are package scoped (rather than block scoped, as "use
    strict;" is. That is, you can refer to a variable from package "Other"
    as "Other::var".

    As with all "use" directives, defining a variable happens at compile
    time. This, it's probably not correct to put a variable declaration
    inside of a conditional statement (like "if ($foo) {use variable ...}").

    Omitting the value for a symbol gives it the value of "undef". This
    isn't so nice as it may sound, though, because in this case you must
    either quote the symbol name, or use a big arrow "=>" with nothing to
    point to. It is probably best to declare these explicitly.

        use variable bacon  =>  ();
        use variable ham    =>  undef;

    The result from evaluating a list constant in a scalar context is not
    documented, and is not guaranteed to be any particular value in the
    future. In particular, you should not rely upon it being the number of
    elements in the list, especially since it is not necessarily that value
    in the current implementation.

    In the rare case in which you need to discover at run time whether a
    particular variable has been declared via this module, you may use this
    function to examine the hash %variable::declared. If the given variable
    name does not include a package name, the current package is used.

        sub declared ($) {
            use variable;                   # don't omit this!
            my $name =  shift;
               $name =~ s/^::/main::/;
            my $pkg  =  caller;
            my $full = $name =~ /::/ ? $name : "${pkg}::$name";
            $variable::declared {$full};
        }

BUGS
    A variable with the name in the list "STDIN STDOUT STDERR ARGV ARGVOUT
    ENV INC SIG" is not allowed anywhere but in package "main::", for
    technical reasons.

    You can get into trouble if you use variables in a context which
    automatically quotes barewords (as is true for any subroutine call). For
    example, you can't say "$hash {variable}" because "variable" will be
    interpreted as a string. Use "$hash {variable ()}" or "$hash
    {+variable}" to prevent the bareword quoting mechanism from kicking in.
    Similarly, since the "=>" operator quotes a bareword immediately to its
    left, you have to say "variable () => 'value'" (or simple use a comma in
    place of the big arrow) instead of "variable => 'value'"

DEVELOPMENT
    The current sources of this module are found on github,
    <git://github.com/Abigail/variable.git>.

AUTHOR
    This package was written by Abigail, cpan@abigail.be.

COPYRIGHT AND LICENSE
    Copyright (C) 2000, 2009, Abigail

    Permission is hereby granted, free of charge, to any person obtaining a
    copy of this software and associated documentation files (the
    "Software"), to deal in the Software without restriction, including
    without limitation the rights to use, copy, modify, merge, publish,
    distribute, sublicense, and/or sell copies of the Software, and to
    permit persons to whom the Software is furnished to do so, subject to
    the following conditions:

    The above copyright notice and this permission notice shall be included
    in all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
    IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
    CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

THANKS
    The author wishes to thank EFNet's #python IRC channel for the
    inspiration to write this module.

    A lot of the code and documentation of "constant.pm" was cut and pasted
    in.