
![]() | ![]() |
10.16. Nesting Subroutines
10.16.1. Problem
You
want subroutines to nest, such that one subroutine is visible and
callable only from another. When you try the obvious approach of
nesting sub FOO
{ sub BAR
{ } ...
}, Perl gives warnings about variables that will
not stay shared.
10.16.2. Solution
Instead of making the inner functions normal subroutines, make them
closures and temporarily assign their references to the typeglob of
the right name to create a localized function.
10.16.3. Discussion
If you use nested subroutines in other programming languages with
their own private variables, you'll have to work at it a bit in Perl.
The intuitive coding of this kind of thing gives the warning "will
not stay shared." For example, this won't work:sub outer {
my $x = $_[0] + 35;
sub inner { return $x * 19 } # WRONG
return $x + inner( );
}
The following is a workaround:sub outer {
my $x = $_[0] + 35;
local *inner = sub { return $x * 19 };
return $x + inner( );
}
Now
inner( ) can be called only from within
outer( ) because of the temporary assignments of
the closure. Once called, it has normal access to the lexical
variable $x from the scope of outer(
).This essentially creates a function local to another function,
something not directly supported in Perl; however, the programming
isn't always clear.
10.16.4. See Also
The sections on "Symbol Tables" in Chapter 10 in
Programming Perl and in
perlmod(1); the sections on "Closures" and
"Symbol Table References" in Chapter 8 of
Programming Perl and
the discussion of closures in perlref(1); Recipe 10.13; Recipe 11.4
![]() | ![]() | ![]() |
10.15. Trapping Undefined Function Calls with AUTOLOAD | ![]() | 10.17. Writing a Switch Statement |

Copyright © 2003 O'Reilly & Associates. All rights reserved.