Oft times creating modules is not necessary (or perhaps wanted) at a particular site. Copying and pasting the same code over and over can also become cumbersome. A simple middle ground is to create Perl shared libaries that use the requires method. Simple shared libraries can be setup so a Perl site administrator and/or system administrator does not have to solely manage the code.
|
|
Local Perl Libs
Sometimes a site has need for
easily accessible Perl libraries.
Three methods to go about keeping handy Perl code readily available are:
-
Just keep a code repository of functions and dump them into programs
on an as needed basis.
-
Write a Perl library with a group of functions in them.
-
Write Perl modules.
A text on this site discusses the
first option, this text deals with the second option. All three bear
discussion though. Within this article, setting up a library (not
module) will be addressed.
Weighing In
Many factors have to be weighed to argue either for or against
simply yank putting versus a local requires versus
writing a module.
The yank put method seems appropriate for
low frequency deployment. An example is a one time or
limited time program. Many system administrators use this method
because, well managing libraries is no fun.
When a small set of programs or low frequency of development
exists is the effort worth it?
Creating local libraries using the requires include method in
Perl is a middle ground.
A shared local set of libraries may be created
that the Perl administrator does not have to solely maintain. A possible
scenario is the line between sysadmin and system programmer. It is
safe to say that the programmer in is a competent
programmer but may not know much about administering a
Perl installation on the system. By creating a shared area
on the filesystem, the sysadmin and programmer can deposit their libraries
and indeed - benefit from eachother's work.
Going the full monty of modules requires a bit more work. Modules
can be setup with shared access. To keep downloaded modules
from interfering with local modules, some administrative work needs to be done.
If a module is good enough, it may be uploaded
to CPAN
and installed as part of the site install. Note that perl
libs - just files with some functions in them - can also be uploaded
to CPAN.
The last item to discuss is documentation. Method one has no
real strict rules for documentation. Method two does not either,
gnerally documentation is included.
Method three requires documentation.
Implementation Examples
Since yanking/putting functions from one file to another is pretty self
explanatory, a look at creating a local library is presented.
Implementation Details
At the imaginary site is an archive nfs server. On the server
are directories packed with archives and a set of files listing archives.
How the archives are organized
is not important, what is important is the number of growing
Perl programs and scripts that access them. These particular bits
do the same operations over and over:
-
Loading directories into arrays
-
Loading files into arrays
-
Reverse sorting
-
Chomping every item in the directory list
The goal: put those tasks into a separate readable location to save
time.
The Subroutines
load_file
##
# load_file: Open a file, read each line into an array, close the
# file and return the array of lines.
##
sub load_file
{
my ($file) = shift;
my @file_contents;
open(FILE, $file) or die "Unable to open file $file: $!n";
@file_contents = <FILE>;
close FILE;
return @file_contents;
}
load_dir
##
# load_dir: Open a directory, read each entry into an array, close
# the directory handle and return the array.
##
sub load_dir
{
my ($dir) = shift;
my @dir_contents;
opendir(DIR, $dir) or die "Unable to open dir $dir: $!n";
@dir_contents = readdir(DIR);
close(DIR);
return @dir_contents;
}
rsort
##
# rsort: Sort then reverse an array.
##
sub rsort
{
my (@contents) = @_;
@contents = sort(@contents);
return (reverse(@contents));
}
atomic_chomp
##
# atomic_chomp: Chomp every item on an array, return the array.
##
sub atomic_chomp
{
my (@list2chomp) = @_;
foreach(@list2chomp) {
chomp($_);
}
return @list2chomp;
}
Documentation
Time to add documentation.
Perldoc tags go in the
source file as a stub. The markup is self explanatory:
__END__
=head1 DESCRIPTION
This small library provides four simple function: load a file
into an array, load a directory into an array, sort and reverse
an array and chomp every item in an array.
The usage for each is:
load_file(filename);
load_dir(dirname);
rsort(@array);
atomic_chomp(@array);
=head1 EXAMPLES
my @foo = load_dir("/home/mui");
@foo = rsort(@foo);
($item1, $item2) = atomic_chomp($item1, $item2);
=head1 PREREQUISITES
none
=head1 COREQUISITES
none
=cut
Putting It Together
The now finished lib is ready:
##
# load_file: Open a file, read each line into an array, close the
# file and return the array of lines.
##
sub load_file
{
my ($file) = shift;
my @file_contents;
open(FILE, $file) or die "Unable to open file $file: $!n";
@file_contents = <FILE>;
close FILE;
return @file_contents;
}
##
# load_dir: Open a directory, read each entry into an array, close
# the directory handle and return the array.
##
sub load_dir
{
my ($dir) = shift;
my @dir_contents;
opendir(DIR, $dir) or die "Unable to open dir $dir: $!n";
@dir_contents = readdir(DIR);
close(DIR);
return @dir_contents;
}
##
# rsort: Sort then reverse an array.
##
sub rsort
{
my (@contents) = @_;
@contents = sort(@contents);
return (reverse(@contents));
}
##
# atomic_chomp: Chomp every item on an array, return the array.
##
sub atomic_chomp
{
my (@list2chomp) = @_;
foreach(@list2chomp) {
chomp($_);
}
return @list2chomp;
}
1; # Main - return a true value
__END__
=head1 DESCRIPTION
This small library provides four simple function: load a file
into an array, load a directory into an array, sort and reverse
an array and chomp every item in an array.
The usage for each is:
load_file(filename);
load_dir(dirname);
rsort(@array);
atomic_chomp(@array);
=head1 EXAMPLES
my @foo = load_dir("/home/mui");
@foo = rsort(@foo);
($item1, $item2) = atomic_chomp($item1, $item2);
=head1 PREREQUISITES
none
=head1 COREQUISITES
none
=cut
The only change is the addition of the ;1 , a true return
signal is needed to use the library.
The Lib in Action
Time to take a look at the lib in action, first, the perldoc output:
[jrf@vela:~$] perldoc atomic.pl
ATOMIC(1) User Contributed Perl Documentation ATOMIC(1)
DESCRIPTION
This small library provides four simple function: load a file into an
array, load a directory into an array, sort and reverse an array and
chomp every item in an array.
The usage for each is:
load_file(filename);
load_dir(dirname);
rsort(@array);
atomic_chomp(@array);
EXAMPLES
my @foo = load_dir("/home/mui");
@foo = rsort(@foo);
($item1, $item2) = atomic_chomp($item1, $item2);
PREREQUISITES
none
COREQUISITES
none
perl v5.8.8 2006-05-16 ATOMIC(1)
An example of using the library:
#!/usr/bin/env perl
# atomtest - test out the atomic functions
use strict;
require "/path/to/atomic.pl";
my @dirlist = load_dir("/etc");
my @file = load_file("/etc/passwd");
@dirlist = rsort(@dirlist); # Sort and reverse the directory
@dirlist = atomic_chomp(@dirlist); # Chomp the directory list
listall(@dirlist);
listall(@file);
sub listall
{
my @list2print = @_;
foreach(@list2print) {
print "$_n";
}
}
Instead of cluttering the output atomtest is
piped to wc :
[jrf@vela:~$] ./atomtest | wc -l
244
Summary
Creating a Perl library and sharing via a path is easy.
Creating any shared libraries in an organization can
save time and reduce headaches.
The original text and other material can be found at
systhread.net. Full Story |