"be consistent" | |
PerlMonks |
perlman:perlmodby gods (Initiate) |
on Aug 25, 1999 at 06:32 UTC ( [id://392]=perlman: print w/replies, xml ) | Need Help?? |
perlmodCurrent Perl documentation can be found at perldoc.perl.org. Here is our local, out-dated (pre-5.6) version:
NAMEperlmod - Perl modules (packages and symbol tables)
DESCRIPTION
Packages
Perl provides a mechanism for alternative namespaces to protect packages
from stomping on each other's variables. In fact, there's really no such
thing as a global variable in Perl (although some identifiers default to
the main package instead of the current one). The package statement
declares the compilation unit as being in the given namespace. The scope of
the package declaration is from the declaration itself through the end of
the enclosing block,
eval, sub, or end of file, whichever comes first (the same scope as the
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 emacs macros. It also makes
C++ programmers feel like they know what's going
on--as opposed to using the single quote as separator, which was there to
make Ada programmers feel like they knew what's going on. Because the
old-fashioned syntax is still supported for backwards compatibility, if you
try to use a string like
Packages may be nested inside other packages:
Only identifiers starting with letters (or underscore) are stored in a
package's symbol table. All other symbols are kept in package
(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.
The special symbol
See the perlsub manpage for other scoping issues related to
Symbol Tables
The symbol table for a package happens to be stored in the hash of that
name with two colons appended. The main symbol table's name is thus
The value in each entry of the hash is what you are referring to when you
use the
local *main::foo = *main::bar; local $main::{foo} = $main::{bar}; You can use this to print out all the variables in a package, for instance. The standard dumpvar.pl library and the CPAN module Devel::Symdump make use of this. Assignment to a typeglob performs an aliasing operation, i.e.,
*dick = *richard;
causes variables, subroutines, formats, and file and directory handles
accessible via the identifier
*dick = \$richard;
Which makes This mechanism may be used to pass and return cheap references into or from subroutines if you won't want to copy the whole thing. It only works when assigning to dynamic variables, not lexicals.
%some_hash = (); # can't be my() *some_hash = fn( \%another_hash ); sub fn { local *hashsym = shift; # now use %hashsym normally, and you # will affect the caller's %another_hash my %nhash = (); # do what you want return \%nhash; }
On return, the reference will overwrite the hash slot in the symbol table
specified by the Another use of symbol tables is for making ``constant'' scalars.
*PI = \3.14159265358979;
Now you cannot alter
$PI, which is probably a good thing all in all. This isn't the same as a constant subroutine, which is subject to optimization at compile-time. This isn't.
A constant subroutine is one prototyped to take no arguments and to return a constant expression. See
the perlsub manpage for details on these. The
You can say
sub identify_typeglob { my $glob = shift; print 'You gave me ', *{$glob}{PACKAGE}, '::', *{$glob}{NAME}, "\n"; } identify_typeglob *foo; identify_typeglob *bar::baz; This prints
You gave me main::foo You gave me bar::baz The *foo{THING} notation can also be used to obtain references to the individual elements of *foo, see the perlref manpage.
Package Constructors and Destructors
There are two special subroutine definitions that function as package
constructors and destructors. These are the
A
An
Inside an
Note that when you use the -n and -p switches to Perl,
Perl Classes
There is no special class syntax in Perl, but a package may function as a
class if it provides subroutines to act as methods. Such a package may also
derive some of its methods from another class (package) by listing the
other package name in its global For more on this, see the perltoot manpage and the perlobj manpage.
Perl ModulesA module is just 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. For example, to start a normal module called Some::Module, create a file called Some/Module.pm and start with this template:
package Some::Module; # assumes Some/Module.pm
use strict;
BEGIN { use Exporter (); use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
# set the version for version checking $VERSION = 1.00; # if using RCS/CVS, this may be preferred $VERSION = do { my @r = (q$Revision: 2.21 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker
@ISA = qw(Exporter); @EXPORT = qw(&func1 &func2 &func4); %EXPORT_TAGS = ( ); # eg: TAG => [ qw!name1 name2! ],
# your exported package globals go here, # as well as any optionally exported functions @EXPORT_OK = qw($Var1 %Hashit &func3); } use vars @EXPORT_OK;
# non-exported package globals go here use vars qw(@more $stuff);
# initalize package globals, first exported ones $Var1 = ''; %Hashit = ();
# then the others (which are still accessible as $Some::Module::stuff) $stuff = ''; @more = ();
# all file-scoped lexicals must be created before # the functions below that use them.
# file-private lexicals go here my $priv_var = ''; my %secret_hash = ();
# here's a file-private function as a closure, # callable as &$priv_func; it cannot be prototyped. my $priv_func = sub { # stuff goes here. };
# make all your functions, whether exported or not; # remember to put something interesting in the {} stubs sub func1 {} # no prototype sub func2() {} # proto'd void sub func3($$) {} # proto'd to 2 scalars
# this one isn't exported, but could be called! sub func4(\%) {} # proto'd to 1 hash ref
END { } # module clean-up code here (global destructor) Then go on to declare and use your variables in functions without any qualifications. See the Exporter manpage and the the perlmodlib manpage for details on mechanics and style issues in module creation. Perl modules are included into your program by saying
use Module; or
use Module LIST; This is exactly equivalent to
BEGIN { require Module; import Module; } or
BEGIN { require Module; import Module LIST; } As a special case
use Module (); is exactly equivalent to
BEGIN { require Module; } All Perl module files have the extension .pm. use assumes this so that you don't have to spell out ``Module.pm'' in quotes. This also helps to differentiate new modules from old .pl and .ph 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). The two statements:
require SomeModule; require "SomeModule.pm";
differ from each other in two ways. In the first case, any double colons in
the module name, such as
Because the use statement implies a
require Cwd; # make Cwd:: accessible $here = Cwd::getcwd();
use Cwd; # import names from Cwd:: $here = getcwd();
require Cwd; # make Cwd:: accessible $here = getcwd(); # oops! no main::getcwd()
In general,
Perl packages may be nested inside other package names, so we can have
package names containing
Perl modules always have a .pm 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 .pm 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 say just For more information on writing extension modules, see the perlxstut manpage and the perlguts manpage.
SEE ALSOSee the perlmodlib manpage for general style issues related to building Perl modules and classes as well as descriptions of the standard library and CPAN, the Exporter manpage for how Perl's standard import/export mechanism works, the perltoot manpage for an in-depth tutorial on creating classes, the perlobj manpage for a hard-core reference document on objects, and the perlsub manpage for an explanation of functions and scoping. Return to the Library |
|