5 Symbol - manipulate Perl symbols and their names
12 open($sym, "filename");
16 ungensym $sym; # no effect
18 print qualify("x"), "\n"; # "Test::x"
19 print qualify("x", "FOO"), "\n" # "FOO::x"
20 print qualify("BAR::x"), "\n"; # "BAR::x"
21 print qualify("BAR::x", "FOO"), "\n"; # "BAR::x"
22 print qualify("STDOUT", "FOO"), "\n"; # "main::STDOUT" (global)
23 print qualify(\*x), "\n"; # returns \*x
24 print qualify(\*x, "FOO"), "\n"; # returns \*x
27 print { qualify_to_ref $fh } "foo!\n";
28 $ref = qualify_to_ref $name, $pkg;
30 use Symbol qw(delete_package);
31 delete_package('Foo::Bar');
32 print "deleted\n" unless exists $Foo::{'Bar::'};
37 C<Symbol::gensym> creates an anonymous glob and returns a reference
38 to it. Such a glob reference can be used as a file or directory
41 For backward compatibility with older implementations that didn't
42 support anonymous globs, C<Symbol::ungensym> is also provided.
43 But it doesn't do anything.
45 C<Symbol::qualify> turns unqualified symbol names into qualified
46 variable names (e.g. "myvar" -E<gt> "MyPackage::myvar"). If it is given a
47 second parameter, C<qualify> uses it as the default package;
48 otherwise, it uses the package of its caller. Regardless, global
49 variable names (e.g. "STDOUT", "ENV", "SIG") are always qualified with
52 Qualification applies only to symbol names (strings). References are
53 left unchanged under the assumption that they are glob references,
54 which are qualified by their nature.
56 C<Symbol::qualify_to_ref> is just like C<Symbol::qualify> except that it
57 returns a glob ref rather than a symbol name, so you can use the result
58 even if C<use strict 'refs'> is in effect.
60 C<Symbol::delete_package> wipes out a whole package namespace. Note
61 this routine is not exported by default--you may want to import it
66 BEGIN { require 5.002; }
70 @EXPORT = qw(gensym ungensym qualify qualify_to_ref);
71 @EXPORT_OK = qw(delete_package);
75 my $genpkg = "Symbol::";
78 my %global = map {$_ => 1} qw(ARGV ARGVOUT ENV INC SIG STDERR STDIN STDOUT);
81 # Note that we never _copy_ the glob; we just make a ref to it.
82 # If we did copy it, then SVf_FAKE would be set on the copy, and
83 # glob-specific behaviors (e.g. C<*$ref = \&func>) wouldn't work.
86 my $name = "GEN" . $genseq++;
87 my $ref = \
*{$genpkg . $name};
88 delete $$genpkg{$name};
96 if (!ref($name) && index($name, '::') == -1 && index($name, "'") == -1) {
98 # Global names: special character, "^x", or other.
99 if ($name =~ /^([^a-z])|(\^[a-z])$/i || $global{$name}) {
103 $pkg = (@_ > 1) ?
$_[1] : caller;
105 $name = $pkg . "::" . $name;
110 sub qualify_to_ref
($;$) {
111 return \
*{ qualify
$_[0], @_ > 1 ?
$_[1] : caller };
117 sub delete_package
($) {
120 # expand to full symbol table name if needed
122 unless ($pkg =~ /^main::.*::$/) {
123 $pkg = "main$pkg" if $pkg =~ /^::/;
124 $pkg = "main::$pkg" unless $pkg =~ /^main::/;
125 $pkg .= '::' unless $pkg =~ /::$/;
128 my($stem, $leaf) = $pkg =~ m/(.*::)(\w+::)$/;
129 my $stem_symtab = *{$stem}{HASH
};
130 return unless defined $stem_symtab and exists $stem_symtab->{$leaf};
133 # free all the symbols in the package
135 my $leaf_symtab = *{$stem_symtab->{$leaf}}{HASH
};
136 foreach my $name (keys %$leaf_symtab) {
137 undef *{$pkg . $name};
140 # delete the symbol table
143 delete $stem_symtab->{$leaf};