#!/usr/bin/perl -w use strict; use warnings FATAL => 'all'; use B; use Scalar::Util; use Data::Dumper; local $Data::Dumper::Indent = 1; local $Data::Dumper::Sortkeys = 1; use DumpSymbols; sub walksymtable { my ($symref, $method, $recurse, $prefix) = @_; my $sym; my $ref = Scalar::Util::reftype($symref); my $fullname; no strict 'refs'; $prefix = '' unless defined $prefix; if ($ref eq 'ARRAY') { foreach $sym (@$symref) { $fullname = "*main::".$prefix.$sym; if ($sym =~ /::$/) { $sym = $prefix . $sym; if ($sym ne "main::" && $sym ne "::" && &$recurse($sym)) { walksymtable($fullname, $method, $recurse, $sym); } } else { B::svref_2object(\*$fullname)->$method(); } } } elsif ($ref eq 'HASH') { while (($sym, $ref) = each %$symref) { $fullname = "*main::".$prefix.$sym; if ($sym =~ /::$/) { $sym = $prefix . $sym; if ($sym ne "main::" && $sym ne "::" && &$recurse($sym)) { walksymtable($fullname, $method, $recurse, $sym); } } else { B::svref_2object(\*$fullname)->$method(); } } } elsif ($ref eq 'GLOB') { B::svref_2object(\*$symref)->$method(); } elsif ($ref eq 'REF' || $ref eq 'SCALAR') { B::svref_2object(\${$symref})->$method(); # foreach $sym (@$symref) { # $fullname = "*main::".$prefix.$sym; # if ($sym =~ /::$/) { # $sym = $prefix . $sym; # if ($sym ne "main::" && $sym ne "::" && &$recurse($sym)) { # walksymtable($fullname, $method, $recurse, $sym); # } # } else { # B::svref_2object(\*$fullname)->$method(); # } # } } else { "UNKNOWN REFTYPE: $ref $/"; } } sub walk_it { my ($object,$package) = @_; # B::walksymtable($object, sub { print $package."->".shift->NAME.$/; }, sub { 1 }, $package.'::'); walksymtable($object, sub { print $package."->".shift->NAME.$/; }, sub { 1 }, $package.'::'); print "-" x 30 .$/; } use HTML::Parser; my $a = { g => 1, f => 2 }; bless $a, 'HTML::Parser'; #print Dumper($a); #walk_it($a, 'HTML::Parser'); #print_symbols($a); my $b = [ 'd','e','f' ]; bless $b, 'HTML::Parser'; #print Dumper($b); #walk_it($b, 'HTML::Parser'); #print_symbols($b); my $c = "abcdef"; $c = \$c; bless $c, 'HTML::Parser'; #print Dumper($c); #walk_it($c, 'HTML::Parser'); print_symbols($c);