in reply to load a module or another: Dumper or dd
Discipulus, here's an example using the autoload function from the Module::Load distribution. The autoload will bring in all available functions from the loaded module, where the load function only literally "requires" it (ie. doesn't bring in any functions):
package MyModule; use strict; use warnings; use Module::Load; my $dd_loaded; BEGIN { $dd_loaded = eval { autoload Data::Dump; 1; }; use if ! $dd_loaded, 'Data::Dumper'; } _mydump(\%INC); sub _mydump{ my ($ref) = @_; if ($dd_loaded){ print "using Data::Dump dd\n"; dd $ref; } else { print "using Data::Dumper\n"; print Dumper $ref; } }
I have Data::Dump installed, so here's my output:
using Data::Dump dd { "bytes.pm" => "/home/spek/perl5/perlbrew/perls/perl-5.26 +.1/lib/5.26.1/bytes.pm", "Carp.pm" => "/home/spek/perl5/perlbrew/perls/perl-5.26 +.1/lib/5.26.1/Carp.pm", "constant.pm" => "/home/spek/perl5/perlbrew/perls/perl-5.26 +.1/lib/5.26.1/constant.pm", "Data/Dump.pm" => "/home/spek/perl5/perlbrew/perls/perl-5.26 +.1/lib/site_perl/5.26.1/Data/Dump.pm", "Data/Dumper.pm" => "/home/spek/perl5/perlbrew/perls/perl-5.26 +.1/lib/5.26.1/x86_64-linux/Data/Dumper.pm", "Exporter.pm" => "/home/spek/perl5/perlbrew/perls/perl-5.26 +.1/lib/5.26.1/Exporter.pm", "File/Spec.pm" => "/home/spek/perl5/perlbrew/perls/perl-5.26 +.1/lib/5.26.1/x86_64-linux/File/Spec.pm", "File/Spec/Unix.pm" => "/home/spek/perl5/perlbrew/perls/perl-5.26 +.1/lib/5.26.1/x86_64-linux/File/Spec/Unix.pm", "if.pm" => "/home/spek/perl5/perlbrew/perls/perl-5.26 +.1/lib/5.26.1/if.pm", "Module/Load.pm" => "/home/spek/perl5/perlbrew/perls/perl-5.26 +.1/lib/5.26.1/Module/Load.pm", "overload.pm" => "/home/spek/perl5/perlbrew/perls/perl-5.26 +.1/lib/5.26.1/overload.pm", "overloading.pm" => "/home/spek/perl5/perlbrew/perls/perl-5.26 +.1/lib/5.26.1/overloading.pm", "strict.pm" => "/home/spek/perl5/perlbrew/perls/perl-5.26 +.1/lib/5.26.1/strict.pm", "subs.pm" => "/home/spek/perl5/perlbrew/perls/perl-5.26 +.1/lib/5.26.1/subs.pm", "vars.pm" => "/home/spek/perl5/perlbrew/perls/perl-5.26 +.1/lib/5.26.1/vars.pm", "warnings.pm" => "/home/spek/perl5/perlbrew/perls/perl-5.26 +.1/lib/5.26.1/warnings.pm", "warnings/register.pm" => "/home/spek/perl5/perlbrew/perls/perl-5.26 +.1/lib/5.26.1/warnings/register.pm", "XSLoader.pm" => "/home/spek/perl5/perlbrew/perls/perl-5.26 +.1/lib/5.26.1/XSLoader.pm", }
Now, if I change the following line in that script:
$dd_loaded = eval { autoload Data::Dump; 1; };
To this (note the "x" at the end of Data::Dump):
$dd_loaded = eval { autoload Data::Dumpx; 1; }; # ^ <-- here
...the output changes, and it falls back on Data::Dumper:
using Data::Dumper $VAR1 = { 'Carp.pm' => '/home/spek/perl5/perlbrew/perls/perl-5.26.1/li +b/5.26.1/Carp.pm', 'constant.pm' => '/home/spek/perl5/perlbrew/perls/perl-5.26. +1/lib/5.26.1/constant.pm', 'Exporter.pm' => '/home/spek/perl5/perlbrew/perls/perl-5.26. +1/lib/5.26.1/Exporter.pm', 'warnings/register.pm' => '/home/spek/perl5/perlbrew/perls/p +erl-5.26.1/lib/5.26.1/warnings/register.pm', 'Module/Load.pm' => '/home/spek/perl5/perlbrew/perls/perl-5. +26.1/lib/5.26.1/Module/Load.pm', 'XSLoader.pm' => '/home/spek/perl5/perlbrew/perls/perl-5.26. +1/lib/5.26.1/XSLoader.pm', 'vars.pm' => '/home/spek/perl5/perlbrew/perls/perl-5.26.1/li +b/5.26.1/vars.pm', 'File/Spec.pm' => '/home/spek/perl5/perlbrew/perls/perl-5.26 +.1/lib/5.26.1/x86_64-linux/File/Spec.pm', 'Data/Dumper.pm' => '/home/spek/perl5/perlbrew/perls/perl-5. +26.1/lib/5.26.1/x86_64-linux/Data/Dumper.pm', 'strict.pm' => '/home/spek/perl5/perlbrew/perls/perl-5.26.1/ +lib/5.26.1/strict.pm', 'if.pm' => '/home/spek/perl5/perlbrew/perls/perl-5.26.1/lib/ +5.26.1/if.pm', 'bytes.pm' => '/home/spek/perl5/perlbrew/perls/perl-5.26.1/l +ib/5.26.1/bytes.pm', 'warnings.pm' => '/home/spek/perl5/perlbrew/perls/perl-5.26. +1/lib/5.26.1/warnings.pm', 'File/Spec/Unix.pm' => '/home/spek/perl5/perlbrew/perls/perl +-5.26.1/lib/5.26.1/x86_64-linux/File/Spec/Unix.pm' };
I use a BEGIN block in this case, as well as a global variable to hold the status of the Data::Dump load, but this is after all, just an example.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: load a module or another: Dumper or dd
by Discipulus (Canon) on Jan 10, 2019 at 10:07 UTC |