Perl

From OpenWetWare

Revision as of 16:50, 28 March 2006 by Ilya (Talk | contribs)
Jump to: navigation, search

Packages

use Module();

is equivalent to

BEGIN { require "Module.pm"; }

and

require Module;
require "Cards/Poker.pm";           # runtime load
require Cards::Poker;               # ".pm" assumed; same as previous
use Cards::Poker;                   # compile-time load, implicit import of package

All programs are in package main until they use a package statement to change this.

package Alpha;
$name = "first";
package Omega;
$name = "last";
package main;
print "Alpha is $Alpha::name, Omega is $Omega::name.\n";

Output:

Alpha is first, Omega is last.

Module example

1    package Cards::Poker;
2    use Exporter;
3    @ISA = ("Exporter");
4    @EXPORT = qw(&shuffle @card_deck);
5    @card_deck = ( );                       # initialize globals
6    sub shuffle { }                        # fill-in definition later
7    1;    # last expression is the overall value of module - must be true
  • Line 1

Typically, a module first switches to a particular package so that it has its own place for global variables and functions, one that won't conflict with that of another program. This package name must be written exactly as in the corresponding use statement when the module is loaded.

  • Line 2 loads in the Exporter module, which manages your module's public interface
  • Line 3 initializes the special, per-package array @ISA to contain the word "Exporter". When a user says use Cards::Poker, Perl implicitly calls a special method, Cards::Poker->import( ). You don't have an import method in your package, because the Exporter package does, and you're inheriting from it because of the assignment to @ISA (is a).
  • Line 4 assigns the list ('&shuffle', '@card_deck') to the special, per-package array @EXPORT. When someone imports this module, variables and functions listed in that array are aliased into the caller's own package.
  • Lines 5 and 6 set up the package global variables and functions to be exported.

Other kinds of library files

A library is a collection of loosely related functions designed to be used by other programs. It lacks the rigorous semantics of a Perl module. The file extension .pl indicates that it's a Perl library file.

Perl libraries—or in fact, any arbitrary file with Perl code in it—can be loaded in using do "file.pl" or with require "file.pl". The latter is preferred in most situations, because unlike do, require does implicit error checking.

Another advantage of require is that it keeps track of which files have already been loaded in the global hash %INC. It doesn't reload the file if %INC indicates that the file has already been read.

Finding modules and libraries

  • @INC is an array that Perl uses to determine the directories to search for libraries and modules.
  • %INC, which is a list of the actual modules Perl has loaded from the environment.

Example:

perl -e "print @INC";

and

foreach $key (sort keys(%INC)) {
   print "$key => $INC{$key}\n";
}

Modifying @INC

Easiest way:

use lib "C:\\MyModuleDirectory";
use MyModule;
Personal tools