The switch code hurt my eyes somewhat so I simplified the glob look up code while keeping within the bounds of those ever handy
strictures
use strict;
our %TYPES = qw/ SCALAR $ ARRAY @ HASH % CODE & GLOB * IO * /;
sub get_ref_name {
my $ref = shift;
my @pkgs = split '::', scalar( shift || caller );
my $tbl = \%main::;
$tbl = $tbl->{"$_\::"}
for @pkgs;
my @names;
for my $n ( keys %$tbl ) {
push @names, map [ $TYPES{$_}, $n ],
grep $ref == *{ $tbl->{$n} }{$_}, keys %TYPES;
push @names, [ $TYPES{GLOB}, $n ]
if $ref == \$tbl->{$n};
}
return map $_->[0].join('::', @pkgs, $_->[1]), @names;
}
our $foo;
our @bar;
our %baz;
*quux = \$foo;
print join(', ', get_ref_name($_)), "\n"
for \( $foo, @bar, %baz ), \&get_ref_name;
__output__
$main::quux, $main::foo
@main::bar
%main::baz
*main::wurble
&main::get_ref_name
And that whole method can probably be done away with some
B style magic.