![]() |
||
![]() Watcom C/C++ Perl 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'} }; |