Nesting Subroutines (Perl Cookbook, 2nd Edition)

## 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

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