Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Create a hash of your 'my' variables
Perl Perl6
branch: master

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
doc
lib
test
.travis.yml
About
Changes
Meta
ReadMe.pod

ReadMe.pod

Name

lexicals - Get a hash of your current 'my' variables

lexicals-pm

Synopsis

    use Template::Toolkit::Simple;
    use lexicals;

    sub mail {
      my $self = shift;
      my $name = 'Mr. ' . $self->get_name;
      my $address = $self->fetch_address($name);
      my $stamp = Postage::Stamp->new(0.44);
      my $envelope = tt->render('envelope', lexicals);
    }

Description

Python has a builtin function called locals() that returns the lexically scoped variables in a name/value mapping. This is a very useful idiom. Instead of needing to create a hash like this:

    my $hash = {
      foo => $foo,
      bar => $bar,
    };

Just say:

    my $hash = lexicals;

Assuming you have a $foo and $bar defined, you get the same thing.

The lexicals module exports a function called lexicals. This function returns the lexicals as a hash reference (in scalar or list context).

Arrays and Hashes

The above examples deal with lexical scalars. You can also get back lexical arrays and hashes. Note: since there is no sigil to tell scalars from arrays from hashes, you can't get back a scalar and an array or hash of the same name. In this case, SCALAR beats HASH beats ARRAY. Why? Because I said so! (Actually I just used the sort order of the sigils).

    sub foo {
      my %h = ( O => 'HAI' );
      my @a = [ qw( foo bar baz ) ];
      my $s = 42;
      my %x = ( O => 'HAI' );
      my @x = [ qw( foo bar baz ) ];
      my $x = 42;
      print Dump lexicals;
    }

would yield:

    ---
    a:
    - foo
    - bar
    - baz
    h:
      O: HAI
    s: 42
    x: 42

Note

The lexicals function only reports the lexical variables variables that were defined before where it gets called.

Debugging Trick

This could be a handy idiom for debugging:

    use XXX;

    sub foo {
      ...
      XXX lexicals;     # See your lexicals in the nude.
      ...
    }

See Also

Author

Ingy döt Net <ingy@cpan.org>

Copyright and License

Copyright 2011-2015. Ingy döt Net.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

See http://www.perl.com/perl/misc/Artistic.html

Something went wrong with that request. Please try again.