Previously we talked about the use statement includes calling the import method of the module importing the functions of the module.

How does the module author arrange for that to work? How can the module author declare which functions should the users be able to import? After all there might be helper function or internal functions that should not be called by an external user of the module.

Let's see the cacla.pl script:

#!/usr/bin/perl
use strict;
use warnings;

use A::Calc;

print add(2, 3), "\n";

Here we have use A::Calc; without any list of functions to be imported, yet in the next line we could use the add function imported from that module.

How could the author of the module arrange for that?

Let's see the content of A/Calc.pm:

package A::Calc;
use strict;
use warnings;

use Exporter qw(import);

our @EXPORT = qw(add 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 author had to implement the import function that will be called by the use statement, but because this is such a common thing to do, there is already a module that provides this function. Perl comes with a module called Exporter that provides this import function. So we only had to import the import function by writing

use Exporter qw(import);

and by that the A::Calc module now has an import method.

The way that method behaves is that it looks at the array @EXPORT and imports the functions listed in that array.

Please note, the @EXPORT array was declared using the our keyword.

So in our case, when the user typed in use A::Calc; all the functions listed in @EXPORT, specifically add and multiply will be imported into the main script.

As you can see the A::Calc module also has a function called validate_parameters, but it is not listed in the @EXPORT array and thus it won't be imported into the namespace of the script.

So this is how the author of a module can export certain function and how the user of such module can import those function into another name-space.