perl

How can I list all variables that are in a given scope?


I know I can list all of the package and lexcial variables in a given scope using Padwalker's peek_our and peek_my, but how can I get the names and values of all of the global variables like $" and $/?

#!/usr/bin/perl

use strict;
use warnings;

use PadWalker qw/peek_our peek_my/;
use Data::Dumper;

our $foo = 1;
our $bar = 2;

{
    my $foo = 3;
    print Dumper in_scope_variables();
}

print Dumper in_scope_variables();

sub in_scope_variables {
    my %in_scope = %{peek_our(1)};
    my $lexical  = peek_my(1);
    #lexicals hide package variables
    while (my ($var, $ref) = each %$lexical) {
        $in_scope{$var} = $ref;
    }
    ##############################################
    #FIXME: need to add globals to %in_scope here#
    ##############################################
    return \%in_scope;
}

Solution

  • You can access the symbol table, check out p. 293 of "Programming Perl"
    Also look at Mastering Perl
    Specifically:Mastering Perl: Symbol Tables and Typeglobs

    Those variables you are looking for will be under the main namespace

    A quick Google search gave me:

    {
        no strict 'refs';
    
        foreach my $entry ( keys %main:: )
        {
            print "$entry\n";
        }
    }
    

    You can also do

    *sym = $main::{"/"}
    

    and likewise for other values

    If you want to find the type of the symbol you can do (from mastering perl):

    foreach my $entry ( keys %main:: )
    {
        print "-" x 30, "Name: $entry\n";
    
        print "\tscalar is defined\n" if defined ${$entry};
        print "\tarray  is defined\n" if defined @{$entry};
        print "\thash   is defined\n" if defined %{$entry};
        print "\tsub    is defined\n" if defined &{$entry};
    }