Chapter 17. Exporter

In Chapter 2, we showed how to use modules, some of which pulled functions into the current namespace. Now we’re going to show how to get our own modules to do that.

What use Is Doing

So, what does use do? How does the import list come into action? Perl interprets the use list as a particular form of BEGIN block wrapped around a require and a method call. The following two operations are equivalent:

use Island::Plotting::Maps qw( load_map scale_map draw_map );

BEGIN {
  require Island::Plotting::Maps;
  Island::Plotting::Maps>import( qw( load_map scale_map draw_map ) );
}

First, the require is a package-name require, rather than the string-expression require from Chapter 11. The colons are turned into the native directory separator (such as / for Unix-like systems), and the name is suffixed with .pm (for “perl module”). On a Unix-like system, we end up with:

require "Island/Plotting/Maps.pm";

Note

We can’t use the .pl (for “perl library”) extension that we used earlier since use won’t find it. It only uses the .pm extension.

Recalling the operation of require from earlier, this means Perl looks in the current value of @INC, checks each directory in turn for a subdirectory named Island that contains a subdirectory named Plotting that contains the file named Maps.pm

If Perl doesn’t find an appropriate file after looking at all of @INC, the program dies (which we can trap with an eval). Otherwise, Perl reads and evaluates the first file it finds. As always with require, the ...

Get Intermediate Perl, 2nd Edition now with the O’Reilly learning platform.

O’Reilly members experience live online training, plus books, videos, and digital content from nearly 200 publishers.