=over

=item state VARLIST
X<state>

=item state TYPE VARLIST

=item state VARLIST : ATTRS

=item state TYPE VARLIST : ATTRS

L<C<state>|/state VARLIST> declares a lexically scoped variable, just
like L<C<my>|/my VARLIST>.
However, those variables will never be reinitialized, contrary to
lexical variables that are reinitialized each time their enclosing block
is entered.
See L<perlsub/"Persistent Private Variables"> for details.

If more than one variable is listed, the list must be placed in
parentheses.  With a parenthesised list, L<C<undef>|/undef EXPR> can be
used as a
dummy placeholder.  However, since initialization of state variables in
such lists is currently not possible this would serve no purpose.

Like L<C<my>|/my VARLIST>, L<C<local>|/local EXPR>, and
L<C<our>|/our VARLIST>, L<C<state>|/state VARLIST> can operate on a variable
anywhere it appears in an expression (aside from interpolation in strings).
The declaration will not apply to additional uses of the same variable until
the next statement. This means additional uses of that variable within the
same statement will act as they would have before that declaration occurred,
or result in a strict 'vars' error, as appropriate.

    package main;
    use feature 'state';
    our $x = 2;
    foo($x, state $x = $x + 1, $x); # foo() receives (2, 3, 2)
    foo($x, $main::x);              # foo() receives (3, 2)

Redeclaring a variable in the same scope or statement will "shadow" the
previous declaration, creating a new instance and preventing access to
the previous one. This is usually undesired and, if warnings are enabled,
will result in a warning in the C<shadow> category.

L<C<state>|/state VARLIST> is available only if the
L<C<"state"> feature|feature/The 'state' feature> is enabled or if it is
prefixed with C<CORE::>.  The
L<C<"state"> feature|feature/The 'state' feature> is enabled
automatically with a C<use v5.10> (or higher) declaration in the current
scope.

=back