We saw that if we have a module and we would like to export some of the functions
we can use the Exporter module with
the import
function and we put the list of functions to be exported in the
@EXPORT
array.
As the number of functions we export grows, this soon can get out of hand. Especially
for people who do not
restrict the import by listing the functions to be imported.
People who just write use Module::Name;
are going to receive a growing number
of function in their namespace. Many of those functions they will probably never use and they
just pose a risk of colliding with functions from other sources.
For the module author at first it might have seemed to be a good idea to export everything. After all that makes it much easier to import everything, but later on it turned out that it would be probably better to export by default only the most commonly used functions and have a separate list of functions that the users can opt-in to import.
For that the import
function of the Exporter module
will look at two arrays. The @EXPORT
array holds the list of functions that are imported
by default and the @EXPORT_OK
array holds the list of functions that can also be imported optionally.
So when the use write use Module::Name;
without providing a list of functions, then everything listed
in @EXPORT
will be imported but nothing else.
Alternatively, the user can specify which functions to import by listing them after the module name:
use Module::Name qw(this that);
and then exactly those functions will be imported. Each one of
the requested function names can come from either the @EXPORT
array or the @EXPORT_OK
array.
So given the B::Calc module in the B/Calc.pm file:
package B::Calc;
use strict;
use warnings;
use Exporter qw(import);
our @EXPORT = qw(add);
our @EXPORT_OK = qw(multiply);
my $base = 10;
sub add {
validate_parameters(@_);
my $total = 0;
$total += $_ for (@_);
return $total;
}
sub multiply {
}
sub validate_parameters {
die 'Not all of them are numbers'
if grep {/\D/} @_;
return 1;
}
1;
The user can write
use B::Calc;
and then only the add
function will be imported.
The user can write:
use B::Calc qw(multiply);
and then only the multiply
function will be imported but not the add
function.
So once you start to list the function you'd like to import, you'll have to write down every function and you'll have to specify the exact list of functions to be imported.
Conclusion
@EXPORT
is the list of functions to be imported by default.
@EXPORT_OK
is the list of function to be imported optionally.