home *** CD-ROM | disk | FTP | other *** search
- <!-- $RCSfile$$Revision$$Date$ -->
- <!-- $Log$ -->
- <HTML>
- <TITLE> PERLMOD </TITLE>
- <h2>NAME</h2>
- perlmod - Perl modules (packages)
- <p><h2>DESCRIPTION</h2>
- <h3>Packages</h3>
- Perl provides a mechanism for alternate namespaces to protect packages
- from stomping on each others variables. By default, a Perl script starts
- compiling into the package known as <B>main</B>. You can switch namespaces
- using the <B>package</B> declaration. The scope of the package declaration is
- from the declaration itself to the end of the enclosing block (the same
- scope as the local() operator). Typically it would be the first
- declaration in a file to be included by the
- <A HREF="perlfunc.html#perlfunc_205">require</A>
- operator. You can
- switch into a package in more than one place; it merely influences which
- symbol table is used by the compiler for the rest of that block. You can
- refer to variables and filehandles in other packages by prefixing the
- identifier with the package name and a double colon:
- <B>$Package::Variable</B>. If the package name is null, the <B>main</B> package
- as assumed. That is, <B>$::sail</B> is equivalent to <B>$main::sail</B>.
- <p>(The old package delimiter was a single quote, but double colon
- is now the preferred delimiter, in part because it's more readable
- to humans, and in part because it's more readable to <B>emacs</B> macros.
- It also makes C++ programmers feel like they know what's going on.)
- <p>Packages may be nested inside other packages: <B>$OUTER::INNER::var</B>. This
- implies nothing about the order of name lookups, however. All symbols
- are either local to the current package, or must be fully qualified
- from the outer package name down. For instance, there is nowhere
- within package <B>OUTER</B> that <B>$INNER::var</B> refers to <B>$OUTER::INNER::var</B>.
- It would treat package <B>INNER</B> as a totally separate global package.
- <p>Only identifiers starting with letters (or underscore) are stored in a
- package's symbol table. All other symbols are kept in package <B>main</B>.
- In addition, the identifiers STDIN, STDOUT, STDERR, <B>ARGV</B>,
- ARGVOUT, ENV, INC and SIG are forced to be in package <B>main</B>,
- even when used for other purposes than their built-in one. Note also
- that, if you have a package called <B>m</B>, <B>s</B> or <B>y</B>, then you can't use
- the qualified form of an identifier since it will be interpreted instead
- as a pattern match, a substitution, or a translation.
- <p>(Variables beginning with underscore used to be forced into package
- main, but we decided it was more useful for package writers to be able
- to use leading underscore to indicate private variables and method names.)
- <p>Eval()ed strings are compiled in the package in which the eval() was
- compiled. (Assignments to <B>$SIG{}</B>, however, assume the signal
- handler specified is in the C<main. package. Qualify the signal handler
- name if you wish to have a signal handler in a package.) For an
- example, examine <I>perldb.pl</I> in the Perl library. It initially switches
- to the <B>DB</B> package so that the debugger doesn't interfere with variables
- in the script you are trying to debug. At various points, however, it
- temporarily switches back to the <B>main</B> package to evaluate various
- expressions in the context of the <B>main</B> package (or wherever you came
- from). See
- <A HREF="perldebug.html">
- the perldebug manpage</A>
- .
- <p><h3>Symbol Tables</h3>
- The symbol table for a package happens to be stored in the associative
- array of that name appended with two colons. The main symbol table's
- name is thus <B>%main::</B>, or <B>%::</B> for short. Likewise the nested package
- mentioned earlier is named <B>%OUTER::INNER::</B>.
- <p>The value in each entry of the associative array is what you are
- referring to when you use the <B>*name</B> notation. In fact, the following
- have the same effect, though the first is more efficient because it
- does the symbol table lookups at compile time:
- <p><pre>
- local(*main::foo) = *main::bar; local($main::{'foo'}) =
- $main::{'bar'};
- </pre>
- You can use this to print out all the variables in a package, for
- instance. Here is <I>dumpvar.pl</I> from the Perl library:
- <p><pre>
- package dumpvar;
- sub main::dumpvar {
- ($package) = @_;
- local(*stab) = eval("*${package}::");
- while (($key,$val) = each(%stab)) {
- local(*entry) = $val;
- if (defined $entry) {
- print "\$$key = '$entry'\n";
- }
- </pre>
- <pre>
- if (defined @entry) {
- print "\@$key = (\n";
- foreach $num ($[ .. $#entry) {
- print " $num\t'",$entry[$num],"'\n";
- }
- print ")\n";
- }
- </pre>
- <pre>
- if ($key ne "${package}::" && defined %entry) {
- print "\%$key = (\n";
- foreach $key (sort keys(%entry)) {
- print " $key\t'",$entry{$key},"'\n";
- }
- print ")\n";
- }
- }
- }
- </pre>
- Note that even though the subroutine is compiled in package <B>dumpvar</B>,
- the name of the subroutine is qualified so that its name is inserted
- into package <B>main</B>.
- <p>Assignment to a symbol table entry performs an aliasing operation,
- i.e.,
- <p><pre>
- *dick = *richard;
- </pre>
- causes variables, subroutines and filehandles accessible via the
- identifier <B>richard</B> to also be accessible via the symbol <B>dick</B>. If
- you only want to alias a particular variable or subroutine, you can
- assign a reference instead:
- <p><pre>
- *dick = \$richard;
- </pre>
- makes $richard and $dick the same variable, but leaves
- @richard and @dick as separate arrays. Tricky, eh?
- <p><h3>Package Constructors and Destructors</h3>
- There are two special subroutine definitions that function as package
- constructors and destructors. These are the <B>BEGIN</B> and <B>END</B>
- routines. The <B>sub</B> is optional for these routines.
- <p>A <B>BEGIN</B> subroutine is executed as soon as possible, that is, the
- moment it is completely defined, even before the rest of the containing
- file is parsed. You may have multiple <B>BEGIN</B> blocks within a
- file--they will execute in order of definition. Because a <B>BEGIN</B>
- block executes immediately, it can pull in definitions of subroutines
- and such from other files in time to be visible to the rest of the
- file.
- <p>An <B>END</B> subroutine is executed as late as possible, that is, when the
- interpreter is being exited, even if it is exiting as a result of a
- die() function. (But not if it's is being blown out of the water by a
- signal--you have to trap that yourself (if you can).) You may have
- multiple <B>END</B> blocks within a file--they wil execute in reverse
- order of definition; that is: last in, first out (LIFO).
- <p>Note that when you use the
- <A HREF="perlrun.html#perlrun_353">-n</A>
- and
- <A HREF="perlrun.html#perlrun_354">-p</A>
- switches to Perl, <B>BEGIN</B>
- and <B>END</B> work just as they do in <B>awk</B>, as a degenerate case.
- <p><h3>Perl Classes</h3>
- There is no special class syntax in Perl 5, but a package may function
- as a class if it provides subroutines that function as methods. Such a
- package may also derive some of its methods from another class package
- by listing the other package name in its @ISA array. For more on
- this, see
- <A HREF="perlobj.html">
- the perlobj manpage</A>
- .
- <p><h3>Perl Modules</h3>
- In Perl 5, the notion of packages has been extended into the notion of
- modules. A module is a package that is defined in a library file of
- the same name, and is designed to be reusable. It may do this by
- providing a mechanism for exporting some of its symbols into the symbol
- table of any package using it. Or it may function as a class
- definition and make its semantics available implicitly through method
- calls on the class and its objects, without explicit exportation of any
- symbols. Or it can do a little of both.
- <p>Perl modules are included by saying
- <p><pre>
- use Module;
- </pre>
- or
- <p><pre>
- use Module LIST;
- </pre>
- This is exactly equivalent to
- <p><pre>
- BEGIN { require "Module.pm"; import Module; }
- </pre>
- or
- <p><pre>
- BEGIN { require "Module.pm"; import Module LIST; }
- </pre>
- All Perl module files have the extension <I>.pm</I>.
- <A HREF="perlfunc.html#perlfunc_263">use</A>
- assumes this so
- that you don't have to spell out "<I>Module.pm</I>" in quotes. This also
- helps to differentiate new modules from old <I>.pl</I> and <I>.ph</I> files.
- Module names are also capitalized unless they're functioning as pragmas,
- "Pragmas" are in effect compiler directives, and are sometimes called
- "pragmatic modules" (or even "pragmata" if you're a classicist).
- <p>Because the
- <A HREF="perlfunc.html#perlfunc_263">use</A>
- statement implies a <B>BEGIN</B> block, the importation
- of semantics happens at the moment the
- <A HREF="perlfunc.html#perlfunc_263">use</A>
- statement is compiled,
- before the rest of the file is compiled. This is how it is able
- to function as a pragma mechanism, and also how modules are able to
- declare subroutines that are then visible as list operators for
- the rest of the current file. This will not work if you use
- <A HREF="perlfunc.html#perlfunc_205">require</A>
-
- instead of
- <A HREF="perlfunc.html#perlfunc_263">use</A>
- . Therefore, if you're planning on the module altering
- your namespace, use
- <A HREF="perlfunc.html#perlfunc_263">use</A>
- ; otherwise, use
- <A HREF="perlfunc.html#perlfunc_205">require</A>
- . Otherwise you
- can get into this problem:
- <p><pre>
- require Cwd; # make Cwd:: accessible
- $here = Cwd::getcwd();
- </pre>
- <pre>
- use Cwd; # import names from Cwd::
- $here = getcwd();
- </pre>
- <pre>
- require Cwd; # make Cwd:: accessible
- $here = getcwd(); # oops! no main::getcwd()
- </pre>
- Perl packages may be nested inside other package names, so we can have
- package names containing <B>::</B>. But if we used that package name
- directly as a filename it would makes for unwieldy or impossible
- filenames on some systems. Therefore, if a module's name is, say,
- <B>Text::Soundex</B>, then its definition is actually found in the library
- file <I>Text/Soundex.pm</I>.
- <p>Perl modules always have a <I>.pm</I> file, but there may also be dynamically
- linked executables or autoloaded subroutine definitions associated with
- the module. If so, these will be entirely transparent to the user of
- the module. It is the responsibility of the <I>.pm</I> file to load (or
- arrange to autoload) any additional functionality. The POSIX module
- happens to do both dynamic loading and autoloading, but the user can
- just say <B>use POSIX</B> to get it all.
- <p>For more information on writing extension modules, see
- <A HREF="perlapi.html">
- the perlapi manpage</A>
-
- and
- <A HREF="perlguts.html">
- the perlguts manpage</A>
- .
- <p><h2>NOTE</h2>
- Perl does not enforce private and public parts of its modules as you may
- have been used to in other languages like C++, Ada, or Modula-17. Perl
- doesn't have an infatuation with enforced privacy. It would prefer
- that you stayed out of its living room because you weren't invited, not
- because it has a shotgun.
- <p>The module and its user have a contract, part of which is common law,
- and part of which is "written". Part of the common law contract is
- that a module doesn't pollute any namespace it wasn't asked to. The
- written contract for the module (AKA documentation) may make other
- provisions. But then you know when you <B>use RedefineTheWorld</B> that
- you're redefining the world and willing to take the consequences.
- <p><h2>THE PERL MODULE LIBRARY</h2>
- A number of modules are included the the Perl distribution. These are
- described below, and all end in <I>.pm</I>. You may also discover files in
- the library directory that end in either <I>.pl</I> or <I>.ph</I>. These are old
- libaries supplied so that old programs that use them still run. The
- <I>.pl</I> files will all eventually be converted into standard modules, and
- the <I>.ph</I> files made by <B>h2ph</B> will probably end up as extension modules
- made by <B>h2xs</B>. (Some <I>.ph</I> values may already be available through the
- POSIX module.) The <B>pl2pm</B> file in the distribution may help in your
- conversion, but it's just a mechanical process, so is far from bullet proof.
- <p><h3>Pragmatic Modules</h3>
- They work somewhat like pragmas in that they tend to affect the compilation of
- your program, and thus will usually only work well when used within a
-
- <A HREF="perlfunc.html#perlfunc_263">use</A>
- , or
- <A HREF="perlfunc.html#perlfunc_180">no</A>
- . These are locally scoped, so if an inner BLOCK
- may countermand any of these by saying
- <p><pre>
- no integer;
- no strict 'refs';
- </pre>
- which lasts until the end of that BLOCK.
- <p>The following programs are defined (and have their own documentation).
- <p>
- <dl>
- <dt><B><B>integer</B></B>
- <dd>
- Perl pragma to compute arithmetic in integer instead of double
- <p></dd>
- <dt><B><B>less</B></B>
- <dd>
- Perl pragma to request less of something from the compiler
- <p></dd>
- <dt><B><B>sigtrap</B></B>
- <dd>
- Perl pragma to enable stack backtrace on unexpected signals
- <p></dd>
- <dt><B><B>strict</B></B>
- <dd>
- Perl pragma to restrict unsafe constructs
- <p></dd>
- <dt><B><B>subs</B></B>
- <dd>
- Perl pragma to predeclare sub names
- <p></dd>
-
- </dl>
-
- <h3>Standard Modules</h3>
- The following modules are all expacted to behave in a well-defined
- manner with respect to namespace pollution because they use the
- Exporter module.
- See their own documentation for details.
- <p>
- <dl>
- <dt><B><B>Abbrev</B></B>
- <dd>
- create an abbreviation table from a list
- <p></dd>
- <dt><B><B>AnyDBM_File</B></B>
- <dd>
- provide framework for multiple DBMs
- <p></dd>
- <dt><B><B>AutoLoader</B></B>
- <dd>
- load functions only on demand
- <p></dd>
- <dt><B><B>AutoSplit</B></B>
- <dd>
- split a package for autoloading
- <p></dd>
- <dt><B><B>Basename</B></B>
- <dd>
- parse file anme and path from a specification
- <p></dd>
- <dt><B><B>Benchmark</B></B>
- <dd>
- benchmark running times of code
- <p></dd>
- <dt><B><B>Carp</B></B>
- <dd>
- warn or die of errors (from perspective of caller)
- <p></dd>
- <dt><B><B>CheckTree</B></B>
- <dd>
- run many filetest checks on a tree
- <p></dd>
- <dt><B><B>Collate</B></B>
- <dd>
- compare 8-bit scalar data according to the current locale
- <p></dd>
- <dt><B><B>Config</B></B>
- <dd>
- access Perl configuration option
- <p></dd>
- <dt><B><B>Cwd</B></B>
- <dd>
- get pathname of current working directory
- <p></dd>
- <dt><B><B>DynaLoader</B></B>
- <dd>
- Dynamically load C libraries into Perl code
- <p></dd>
- <dt><B><B>English</B></B>
- <dd>
- use nice English (or <B>awk</B>) names for ugly punctuation variables
- <p></dd>
- <dt><B><B>Env</B></B>
- <dd>
- Perl module that imports environment variables
- <p></dd>
- <dt><B><B>Exporter</B></B>
- <dd>
- module to control namespace manipulations
- <p></dd>
- <dt><B><B>Fcntl</B></B>
- <dd>
- load the C Fcntl.h defines
- <p></dd>
- <dt><B><B>FileHandle</B></B>
- <dd>
- supply object methods for filehandles
- <p></dd>
- <dt><B><B>Find</B></B>
- <dd>
- traverse a file tree
- <p></dd>
- <dt><B><B>Finddepth</B></B>
- <dd>
- traverse a directory structure depth-first
- <p></dd>
- <dt><B><B>Getopt</B></B>
- <dd>
- basic and extended getopt(3) processing
- <p></dd>
- <dt><B><B>MakeMaker</B></B>
- <dd>
- generate a Makefile for Perl extension
- <p></dd>
- <dt><B><B>Open2</B></B>
- <dd>
- open a process for both reading and writing
- <p></dd>
- <dt><B><B>Open3</B></B>
- <dd>
- open a process for reading, writing, and error handling
- <p></dd>
- <dt><B><B>POSIX</B></B>
- <dd>
- Perl interface to IEEE 1003.1 namespace
- <p></dd>
- <dt><B><B>Ping</B></B>
- <dd>
- check a host for upness
- <p></dd>
- <dt><B><B>Socket</B></B>
- <dd>
- load the C socket.h defines
- <p></dd>
-
- </dl>
-
- <h3>Extension Modules</h3>
- Extension modules are written in C (or a mix of Perl and C) and get
- dynamically loaded into Perl if and when you need them. Supported
- extension modules include the Socket, Fcntl, and POSIX modules.
- <p>The following are popular C extension modules, which while available at
- Perl 5.0 release time, do not come not bundled (at least, not completely)
- due to their size, volatility, or simply lack of time for adequate testing
- and configuration across the multitude of platforms on which Perl was
- beta-tested. You are encouraged to look for them in archie(1L), the Perl
- FAQ or Meta-FAQ, the WWW page, and even their authors before randomly
- posting asking for their present condition and disposition. There's no
- guarantee that the names or addresses below have not changed since printing,
- and in fact, they probably have!
- <p>
- <dl>
- <dt><B><B>Curses</B></B>
- <dd>
- Written by William Setzer <<I>William_Setzer@ncsu.edu</I>>, while not
- included with the standard distribution, this extension module ports to
- most systems. FTP from your nearest Perl archive site, or try
- <p></dd>
- <pre>
- ftp://ftp.ncsu.edu/pub/math/wsetzer/cursperl5??.tar.gz
- </pre>
- It is currently in alpha test, so the name and ftp location may
- change.
- <p><dt><B><B>DBI</B></B>
- <dd>
- This is the portable database interface written by
- <<I>Tim.Bunce@ig.co.uk</I>>. This supersedes the many perl4 ports for
- database extensions. The official archive for DBperl extensions is
- <I>ftp.demon.co.uk:/pub/perl/db</I>. This archive contains copies of perl4
- ports for Ingres, Oracle, Sybase, Informix, Unify, Postgres, and
- Interbase, as well as rdb and shql and other non-SQL systems.
- <p></dd>
- <dt><B><B>DB_File</B></B>
- <dd>
- Fastest and most restriction-free of the DBM bindings, this extension module
- uses the popular Berkeley DB to tie() into your hashes. This has a
- standardly-distributed man page and dynamic loading extension module, but
- you'll have to fetch the Berkeley code yourself. See DB_File for
- where.
- <p></dd>
- <dt><B><B>Sx</B></B>
- <dd>
- This extension module is a front to the Athena and Xlib libraries for Perl
- GUI progamming, originally written by by Dominic Giampaolo
- <<I>dbg@sgi.com</I>>, then and rewritten for Sx by Frédéric
- Chauveau <<I>fmc@pasteur.fr</I>>. It's available for FTP from
- <p></dd>
- <pre>
- ftp.pasteur.fr:/pub/Perl/Sx.tar.gz
- </pre>
- <dt><B><B>Tk</B></B>
- <dd>
- This extension module is an object-oriented Perl5 binding to the popular
- tcl/tk X11 package. However, you need know no TCL to use it!
- It was written by Malcolm Beattie <<I>mbeattie@sable.ox.ac.uk</I>>.
- If you are unable to locate it using archie(1L) or a similar
- tool, you may try retrieving it from <I>/private/Tk-october.tar.gz</I>
- from Malcolm's machine listed above.
- <p></dd>
-
- </dl>
-
-