BSE
  Watcom C/C++
  Perl
   Examples
   Tutorials
  Imager
    Imager::Graph
  ImUgly
  Contact Us
 

Checking if a package exists

Back to Perl Examples
The 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(\%::)' | less
which 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'}
        };