package SymbolName; use strict; use warnings; use base qw/ Exporter /; our @ISA = qw/ Exporter /; our @EXPORT = qw/ get_symbol_name /; sub get_symbol_name { my( $var_ref, $pkg ) = @_; $pkg |= 'main'; $pkg .= '::'; my $type = ref $var_ref; foreach my $key ( keys %:: ) { my $table_ref; SWITCH: { no strict qw/ refs /; ! $type and die "Must pass get_symbol_name() a global " . "variable ref.\n"; $type =~ /SCALAR/ && do { $table_ref = \${${$pkg}{$key}}; last SWITCH; }; $type =~/ARRAY/ && do { $table_ref = \@{${$pkg}{$key}}; last SWITCH; }; $type =~/HASH/ && do { $table_ref = \%{${$pkg}{$key}}; last SWITCH; }; $type =~ /CODE/ && do { $table_ref = \&{${$pkg}{$key}}; last SWITCH; }; $type =~ /GLOB/ && do { $table_ref = \${$pkg}{$key}; last SWITCH; }; die "Unsupported type: $type\n"; } return $key if $var_ref eq $table_ref } die "Variable ref $var_ref not found in $pkg\'s symbol table.\n"; } 1;