[Wellington-pm] 'enum' for Perl?

Grant McLean grant at mclean.net.nz
Sun Apr 16 23:34:53 PDT 2006


On Mon, 2006-04-17 at 12:36 +1200, Cliff Pratt wrote:
> Cliff Pratt wrote:
...
> > I can see how that works, but some modules export what appear to be 
> > variables, eg
> > 
> > use Glib qw(TRUE FALSE) ;
> > 
> > and you can then say, eg
> > 
> > my $debug = FALSE ;
> > 
> > Or is FALSE just a hidden subroutine that sets the return to the 
> > appropriate value?
> > 
> To answer my question, Glib uses the Exporter module and 'use constant'. 
> I don't yet understand *what* it is doing exactly, but that is what is 
> *does* do. <grin>

Good detective work :-)

If you care how it works, this ...

  use constant TRUE => 1;

... is actually translated to this ...

  sub TRUE() { return 1; }

The Exporter module can alias a subroutine or a variable from one
namespace (eg: Glib::TRUE) to another (eg: main::TRUE).  Which allows
you to call the subroutine as if you had defined it in your own code.

One non-obvious twist is that the subroutine was declared like this:

  sub TRUE() { return 1; }

rather than this:

  sub TRUE { return 1; }

The significance of the empty trailing parentheses after the subroutine
name is that it's a prototype which declares that the subroutine takes
no arguments.  Once Perl has compiled your script (and all the modules
it includes) into an in-memory opcode tree, it does an optimisation pass
through the opcodes.  One of the things it does during this pass is to
'inline' the constants by replacing all calls to subroutines which
return a literal value and are prototyped to take no arguments, with the
literal values themselves.  Thus, at run-time, the TRUE subroutine is
never actually called.

Sorry you asked? :-)

Cheers
Grant





More information about the Wellington-pm mailing list