Showing entries with tag "Module".

Found 3 entries

Perl: See the path of a module

I've been testing various version of a Perl module and I wanted to make sure I was testing with the right one. This code snippet will output the paths of the loaded modules.

perl -MData::Dump::Color -e 'dd(\%INC);'

This example loads Data::Dump::Color and then outputs the contents of %INC which contains the paths of all loaded modules.

Leave A Reply

Perl: Conditionally load a module

I am using Data::Dump which has a drop in replacement named Data::Dump::Color. I wanted to conditionally/programmatically load a specific module.

if ($color) {
    use Data::Dump::Color;
} else {
    use Data::Dump;
}

This doesn't work because use statements are run before ANY other code is run. The above code will load BOTH modules, because use always runs. Instead you have to use require.

if ($color) {
    require Data::Dump::Color;
    Data::Dump::Color->import();
} else {
    require Data::Dump;
    Data::Dump->import();
}

Calling require does not automatically import all the exported functions, so you have to specifically call the include() function.

Leave A Reply - 2 Replies

Perl: detect if a module is installed before using it

I wanted to check if a Perl module was installed at runtime, and error out accordingly if it wasn't. This allows me to print intelligent error messages if a module is not installed.

eval { require Weird::Module; };
if ($@) { die("Module is not installed\n"); }

This allows you to create runtime functions depending on which module is installed:

# Debug print variable using either Data::Dump::Color (preferred) or Data::Dumper
# Creates methods k() and kd() to print, and print & die respectively
BEGIN {
    if (eval { require Data::Dump::Color }) {
        *k = sub { Data::Dump::Color::dd(@_) };
    } else {
        require Data::Dumper;
        *k = sub { print Data::Dumper::Dumper(\@_) };
    }

    sub kd {
        k(@_);

        printf("Died at %2\$s line #%3\$s\n",caller());
        exit(15);
    }
}

Or you can use AUTOLOAD to only load the module if you actually call k()

sub AUTOLOAD { 
    our $AUTOLOAD; # keep 'use strict' happy

    if ($AUTOLOAD eq 'main::k' || $AUTOLOAD eq 'main::kd') {
        if (eval { require Data::Dump::Color }) {
            *k = sub { Data::Dump::Color::dd(@_) };
        } else {
            require Data::Dumper;
            *k = sub { print Data::Dumper::Dumper(@_) };
        }

        sub kd {
            k(@_);

            printf("Died at %2\$s line #%3\$s\n",caller());
            exit(15);
        }

        eval($AUTOLOAD . '(@_)');
    }
}

These functions should mimic some Krumo functionality.

Leave A Reply