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