- publishing free software manuals
Perl Language Reference Manual
by Larry Wall and others
Paperback (6"x9"), 724 pages
ISBN 9781906966027
RRP £29.95 ($39.95)

Sales of this book support The Perl Foundation! Get a printed copy>>>

Variable "%s" is not available

(W closure) During compilation, an inner named subroutine or eval is attempting to capture an outer lexical that is not currently available. This can happen for one of two reasons. First, the outer lexical may be declared in an outer anonymous subroutine that has not yet been created. (Remember that named subs are created at compile time, while anonymous subs are created at run-time.) For example,

sub { my $a; sub f { $a } }

At the time that f is created, it can't capture the current value of $a, since the anonymous subroutine hasn't been created yet. Conversely, the following won't give a warning since the anonymous subroutine has by now been created and is live:

sub { my $a; eval 'sub f { $a }' }->();

The second situation is caused by an eval accessing a variable that has gone out of scope, for example,

sub f {
    my $a;
    sub { eval '$a' }
}
f()->();

Here, when the '$a' in the eval is being compiled, f() is not currently being executed, so its $a is not available for capture.

ISBN 9781906966027Perl Language Reference ManualSee the print edition