Although there are now Devel:: modules on CPAN which do an excellent job of making symbol tables easy to play with, I wrote these three routines for quick debugging of some code which played around with Safe and other symbol table tricks.
sub packages {
print "Packages: ", join(" ", grep /::$/, keys %::), "\n";
print " INC: ", join(" ", sort keys %INC), "\n";
}
sub symbols {
my $pkg = $_[0] || '';
no strict 'refs';
print "Symbols: ", join(" ", sort keys %{$pkg.'::'}), "\n";
}
sub symbols2 {
my $pkg = $_[0] || '';
no strict 'refs';
print "Symbols in ${pkg}::\n";
my $hash = *{$pkg.'::'}{HASH};
for (sort grep {!/::$|^_</} keys %$hash) {
my $sym = $_;
my $glob = $hash->{$_};
$sym =~ s/[[:cntrl:]]/'^' . chr(ord($&) + ord('@'))/ge;
print " $sym (", *{$glob}{PACKAGE}, '::', *{$glob}{NAME}, "): ";
if (defined $$_) {
print "SCALAR='$$glob' ";
};
for my $THING (qw(ARRAY HASH CODE IO)) {
my $ref = *{$glob}{$THING};
if (defined $ref) {
print "$THING=$ref ";
}
}
print "\n";
}
}