Symbol::Util - Additional utils for Perl symbols manipulation
use Symbol::Util ':all'; my $caller = caller; *{ fetch_glob("${caller}::foo") } = sub { "this is foo" }; my $coderef = fetch_glob("${caller}::bar", "CODE"); sub baz { 42; } export_glob($caller, "baz"); print join "\n", keys %{ stash("main") }; delete_glob("${caller}::foo", "CODE"); use constant PI => 3.14159265; delete_sub "PI"; # remove constant from public API require YAML; export_package(__PACKAGE__, "YAML", "Dump"); # import YAML::Dump unexport_package(__PACKAGE, "YAML"); # remove imported symbols no Symbol::Util; # clean all symbols imported from Symbol::Util
This module provides a set of additional functions useful for Perl symbols manipulation.
All Perl symbols from the same package are organized as a stash. Each symbol (glob) contains one or more of following slots: SCALAR, ARRAY, HASH, CODE, IO, FORMAT. These slots are also accessible as standard variables or bare words.
SCALAR
ARRAY
HASH
CODE
IO
FORMAT
The Perl symbols table is directly accessible with typeglob prefix but it can be difficult to read and problematic if strict mode is used. Also the access to stash, glob and one of its slot have different syntax notation.
stash and fetch_glob functions gets stash or glob without need to use no strict 'refs'.
stash
fetch_glob
no strict 'refs'
delete_glob function allows to delete specific slot of symbol name without deleting others.
delete_glob
delete_sub removes the symbol from class API. This symbol won't be available as an object method.
delete_sub
export_glob function exports a glob to the target package.
export_glob
export_package works like Exporter module and allows to export symbols from one package to other.
export_package
unexport_package allows to delete previously exported symbols.
unexport_package
By default, the class does not export its symbols.
Imports all available symbols.
Deletes all imported symbols from caller name space.
Returns a reference to the stash for the specified name. If the stash does not already exist then it will be created. The name of the stash does not include the :: at the end. It is safe to use this function with use strict 'refs'.
::
use strict 'refs'
print join "\n", keys %{ stash("main") };
Returns a reference to the glob for the specified symbol name. If the symbol does not already exist then it will be created. If the symbol name is unqualified then it will be looked up in the calling package. It is safe to use this function with use strict 'refs'.
If the slot argument is defined and this slot contains defined value, reference to this value is returned. The slot argument can be one of the following strings: SCALAR, ARRAY, HASH, CODE, IO, FORMAT).
my $caller = caller; *{ fetch_glob("${caller}::foo") } = sub { "this is foo" }; my $coderef = fetch_glob("${caller}::foo", "CODE");
Returns a list of slot names for glob with specified name which contain defined value. If the glob is undefined, the undef value is returned. If the glob is defined and has no defined slots, the empty list is returned.
undef
The SCALAR slot is used only if it contains defined value.
my $foo = 42; my @foo = (1, 2); sub foo { 1; }; print join ",", list_glob_slots("foo"); # SCALAR,ARRAY,CODE
Exports a glob name to the target package. Optionally exports only specified slots of the glob.
sub my_function { ... }; sub import { my $caller = caller; export_glob($caller, "my_function"); }
Deletes the specified symbol name if slots are not specified, or deletes the specified slots in the symbol name (could be one or more of the following strings: SCALAR, ARRAY, HASH, CODE, IO, FORMAT).
Function returns the glob reference if there are any slots defined.
our $FOO = 1; sub FOO { "bar" }; delete_glob("FOO", "CODE"); print $FOO; # prints "1" FOO(); # error: sub not found
Deletes (or hides) the specified subroutine name from class API. It means that this subroutine will be no longer available as a class method. The purpose of this function is the same as namespace::clean pragma has: it cleans a package's namespace from unwanted subroutines. Function doesn't delete other slots than CODE slot of the glob.
Function returns the glob reference if there are any other slots still defined than <CODE> slot.
package My::Class; use constant PI => 3.14159265; use Symbol::Util 'delete_sub'; delete_sub "PI"; # remove constant from public API no Symbol::Util; # remove also Symbol::Util::* from public API sub area { my ($self, $r) = @_; return PI * $r ** 2; } print My::Class->area(2); # prints 12.5663706 print My::Class->PI; # Can't locate object method
Exports symbols from package to target. If spec is defined as hash reference, it contains the specification for exporter. Otherwise the standard global variables of package are used (@EXPORT, @EXPORT_OK and %EXPORT_TAGS) to build the specification for exporter. The optional list of names defines an import list.
@EXPORT
@EXPORT_OK
%EXPORT_TAGS
The spec is a reference to hash with following keys:
Contains the list of default imports. It is the same as @EXPORT variable.
Contains the list of allowed imports. It is the same as @EXPORT_OK variable.
Contains the hash with tags. It is the same as %EXPORT_TAGS variable.
See Exporter documentation for explanation of these global variables and list of names.
The export_package function can export symbols from an external package to an external package. This function can also be used as a helper in import method.
import
package My::Package; sub myfunc { }; sub import { my ($package, @names) = @_; my $caller = caller(); return export_package($caller, $package, { OK => [ qw( myfunc ) ], }, @names); };
All exported symbols are tracked and later can be removed with unexport_package function.
The function returns true value if there were no errors.
Deletes symbols previously exported from package to target with export_package function. If the symbol was CODE reference it is deleted with delete_sub function. Otherwise it is deleted with delete_glob function with proper slot as an argument.
Deleting with delete_sub function means that this symbol is not available via class API as an object method.
require YAML; export_package(__PACKAGE__, "YAML", "Dump"); unexport_package(__PACKAGE__, "YAML"); print Dump @INC; # OK __PACKAGE__->Dump; # Can't locate object method
This function can be used as a helper in unimport method.
unimport
package My::Package; sub unimport { my ($package, @names) = @_; my $caller = caller(); return unexport_package($caller, $package); }; package main; use My::Package qw(something); no My::Package; main->something; # Can't locate object method
Symbol, Sub::Delete, namespace::clean, Exporter.
fetch_glob returns undef value if SCALAR slot contains undef value.
delete_glob and delete_sub delete SCALAR slot if it exists and contains undef value.
delete_glob and delete_sub always delete FORMAT slot.
If you find the bug or want to implement new features, please report it at http://rt.cpan.org/NoAuth/Bugs.html?Dist=Symbol-Util
Piotr Roszatycki <dexter@cpan.org>
Copyright (c) 2009, 2012 Piotr Roszatycki <dexter@cpan.org>.
This is free software; you can redistribute it and/or modify it under the same terms as perl itself.
See http://dev.perl.org/licenses/artistic.html
To install Symbol::Util, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Symbol::Util
CPAN shell
perl -MCPAN -e shell install Symbol::Util
For more information on module installation, please visit the detailed CPAN module installation guide.