X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSymbol.pm;h=3bb5d9240c15c4319ab7dfdce7ef3b7526fe05ed;hb=ac0e6a2fd2970df72270aecb94d407fe170b43a7;hp=8739bd2b316e4cb1717796d3a9a67e667e761c05;hpb=c74f62b55c858d7cf9ed72589c05484ffce727b0;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/Symbol.pm b/lib/Symbol.pm index 8739bd2..3bb5d92 100644 --- a/lib/Symbol.pm +++ b/lib/Symbol.pm @@ -15,6 +15,9 @@ Symbol - manipulate Perl symbols and their names ungensym $sym; # no effect + # replace *FOO{IO} handle but not $FOO, %FOO, etc. + *FOO = geniosym; + print qualify("x"), "\n"; # "Test::x" print qualify("x", "FOO"), "\n" # "FOO::x" print qualify("BAR::x"), "\n"; # "BAR::x" @@ -31,7 +34,6 @@ Symbol - manipulate Perl symbols and their names delete_package('Foo::Bar'); print "deleted\n" unless exists $Foo::{'Bar::'}; - =head1 DESCRIPTION C creates an anonymous glob and returns a reference @@ -42,6 +44,10 @@ For backward compatibility with older implementations that didn't support anonymous globs, C is also provided. But it doesn't do anything. +C creates an anonymous IO handle. This can be +assigned into an existing glob without affecting the non-IO portions +of the glob. + C turns unqualified symbol names into qualified variable names (e.g. "myvar" -E "MyPackage::myvar"). If it is given a second parameter, C uses it as the default package; @@ -61,6 +67,15 @@ C wipes out a whole package namespace. Note this routine is not exported by default--you may want to import it explicitly. +=head1 BUGS + +C is a bit too powerful. It undefines every symbol that +lives in the specified package. Since perl, for performance reasons, does not +perform a symbol table lookup each time a function is called or a global +variable is accessed, some code that has already been loaded and that makes use +of symbols in package C may stop working after you delete C, even if +you reload the C module afterwards. + =cut BEGIN { require 5.005; } @@ -68,9 +83,9 @@ BEGIN { require 5.005; } require Exporter; @ISA = qw(Exporter); @EXPORT = qw(gensym ungensym qualify qualify_to_ref); -@EXPORT_OK = qw(delete_package); +@EXPORT_OK = qw(delete_package geniosym); -$VERSION = 1.04; +$VERSION = '1.06'; my $genpkg = "Symbol::"; my $genseq = 0; @@ -89,6 +104,13 @@ sub gensym () { $ref; } +sub geniosym () { + my $sym = gensym(); + # force the IO slot to be filled + select(select $sym); + *$sym{IO}; +} + sub ungensym ($) {} sub qualify ($;$) {