![]() |
||
BSEWatcom C/C++ Perl Notes Examples Tutorials Imager Imager::Graph ImUgly Contact Us |
Checking if a package existsBack to Perl ExamplesThe explanation in this document is incomplete. The following program was inspired by a query in #perl on how to test if a package exists without creating it.
#!/usr/bin/perl -w
use strict;
use DBI;
use Data::Dumper;
sub package_exists {
my ($pack) = @_;
my $base ||= \%::;
while ($pack =~ /(.*?)::(.*)/m
&& exists($base->{$1."::"})) {
$base = *{$base->{$1."::"}}{HASH};
$pack = $2;
}
return exists $base->{$pack."::"};
}
for (qw(DBI CGI Data::Dumper ABC::XYZ)) {
print "$_ ", package_exists($_) ? "exists\n" : "doesn't exist\n";
}
The first step I took in creating this was to have a look at the symbol table for the main module:
perl -MData::Dumper -e 'print Dumper(\%::)' | lesswhich produces the result:
$VAR1 = {
'@' => *{'main::@'},
'_</usr/lib/perl5/5.00503/overload.pm' => *{'main::_</usr/lib/perl5/5.00503/overload.pm'},
'_</usr/lib/perl5/5.00503/vars.pm' => *{'main::_</usr/lib/perl5/5.00503/vars.pm'},
'_</usr/lib/perl5/5.00503/i686-linux/DynaLoader.pm' => *{'main::_</usr/lib/perl5/5.00503/i686-linux/DynaLoader.pm'},
'stdin' => *::stdin,
'SIG' => *::SIG,
'AutoLoader::' => *::AutoLoader::,
'' => *{'main::'},
'VMS::' => *::VMS::,
'Exporter::' => *::Exporter::,
'UNIVERSAL::' => *::UNIVERSAL::,
'' => *{'main::'},
'' => *{'main::'},
'_</usr/lib/perl5/5.00503/AutoLoader.pm' => *{'main::_</usr/lib/perl5/5.00503/AutoLoader.pm'},
'' => *{'main::'},
'DynaLoader::' => *::DynaLoader::,
'' => *{'main::'},
'main::' => *::main::,
'Carp::' => *::Carp::,
'INC' => *::INC,
'_</usr/lib/perl5/5.00503/Data/Dumper.pm' => *{'main::_</usr/lib/perl5/5.00503/Data/Dumper.pm'},
'_</usr/lib/perl5/5.00503/i686-linux/auto/Data/Dumper/Dumper.so' => *{'main::_</usr/lib/perl5/5.00503/i686-linux/auto/Data/Dumper/Dumper.so'},
']' => *{'main::]'},
'_' => *::_,
'"' => *{'main::"'},
'STDIN' => *::STDIN,
'STDOUT' => *::STDOUT,
'stdout' => *::stdout,
'_<perlmain.c' => *{'main::_<perlmain.c'},
'$' => *{'main::$'},
'_<universal.c' => *{'main::_<universal.c'},
'BEGIN' => *::BEGIN,
'ENV' => *::ENV,
'_</usr/lib/perl5/5.00503/Carp.pm' => *{'main::_</usr/lib/perl5/5.00503/Carp.pm'},
'IO::' => *::IO::,
'Dumper' => *::Dumper,
'_<-e' => *{'main::_<-e'},
'Data::' => *::Data::,
'_<DynaLoader.c' => *{'main::_<DynaLoader.c'},
'/' => *{'main::/'},
'vars::' => *::vars::,
'0' => *::0,
'ARGV' => *::ARGV,
'overload::' => *::overload::,
1 => *::1,
'STDERR' => *::STDERR,
'stderr' => *::stderr,
'HASH::' => *::HASH::,
'_<Dumper.c' => *{'main::_<Dumper.c'},
'DB::' => *::DB::,
'CORE::' => *::CORE::,
'_</usr/lib/perl5/5.00503/Exporter.pm' => *{'main::_</usr/lib/perl5/5.00503/Exporter.pm'}
};
| |