I want to do something like this in Perl:
$Module1="ReportHashFile1"; # ReportHashFile1.pm
$Module2="ReportHashFile2"; # ReportHashFile2.pm
if(Condition1)
{
use $Module1;
}
elsif(Condition2)
{
use $Module2;
}
ReportHashFile*.pm contains a package ReportHashFile* .
Also how to reference an array inside module based on dynamic module name?
@Array= @$Module1::Array_inside_module;
Is there anyway I can achieve this. Some sort of compiler directive?
The Comprehensive Perl Archive Network (CPAN) is a repository of over 250,000 software modules and accompanying documentation for 39,000 distributions, written in the Perl programming language by over 12,000 contributors.
The differences are many and often subtle:use only expects a bareword, require can take a bareword or an expression. use is evaluated at compile-time, require at run-time. use implicitly calls the import method of the module being loaded, require does not.
You might find the if
module useful for this.
Otherwise the basic idea is to use require
, which happens at run-time, instead of use
, which happens at compile-time. Note that '
BEGIN {
my $module = $condition ? $Module1 : $Module2;
my $file = $module;
$file =~ s[::][/]g;
$file .= '.pm';
require $file;
$module->import;
}
As for addressing globals, it might be easier if you just exported the variable or a function returning it to the caller, which you could use by its unqualified name. Otherwise there's also the possibility of using a method and calling it as $Module->method_name
.
Alternatively, you could use symbolic references as documented in perlref
. However, that's usually quite a code smell.
my @array = do {
no strict 'refs';
@{ ${ "${Module}::Array_inside_module" } };
};
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With