Subroutine Scope

Just like variables, subroutine names are simply entries in a symbol table or lexical scratchpad. So, all subroutines live in a particular scope, whether it’s lexical, package, or global scope.

Package-Scoped Subroutines

Package scope is the default scope for subs. A sub that is declared without any scope marking is accessible within the module or class where it’s defined with an unqualified call, like subname( ), and accessible elsewhere with a fully qualified call using the Package::Name::subname( ) syntax.[13]

module My::Module {
  sub firstsub ($param) { . . . }

  sub secondsub {
    mysub('arg'); # call the subroutine
  }
}

module Other::Module {
  use My::Module;

  sub thirdsub {
     My::Module::firstsub('arg');
  }
}

This example declares two modules, My::Module and Other::Module. My::Module declares a subroutine firstsub and calls it from within secondsub. Other::Module declares a subroutine thirdsub that calls firstsub using its fully qualified name.

Lexically Scoped Subroutines

Subroutines can also be lexically scoped, just like variables. A myed subroutine makes an entry in the current lexical scratchpad with a & sigil. Lexically scoped subs are called just like a normal subroutine:

if $dining {
    my sub dine ($who, $where) {
         . . . 
    }

    dine($zaphod, "Milliways");
}

# dine($arthur, "Nutri-Matic");  # error

The first call to the lexically scoped dine is fine, but the second would be a compile-time error because dine doesn’t exist in the outer scope.

The our keyword declares a lexically ...

Get Perl 6 and Parrot Essentials, Second Edition now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.