This is pmtools -- a suite of small programs to help manage modules.
The names are totally preliminary, and in fact, so is the code.  We follow
the "keep it small" notion of many tiny tools each doing one thing well,
eschewing giant megatools with millions of options.

Tom Christiansen
[email protected]


=========================================================

pmpath - show the module's full path

   $ pmpath Carp
   /usr/local/devperl/lib/5.00554/Carp.pm

=========================================================

pmvers - get a module version number

   $ pmvers CGI
   2.46

   $ perl5.00404 -S pmvers CGI
   2.42

   $ devperl -S pmvers CGI
   2.46

=========================================================

pmdesc  - get a module description

   $ pmdesc IO::Dir
   IO::Dir (1.03) - supply object methods for directory handles

=========================================================

pmall  - get all installed modules pmdesc descriptions

   $ pmall
   Pod::Html (1.01) - module to convert pod files to HTML
   Config - access Perl configuration information
   DB_File (1.61) - Perl5 access to Berkeley DB
   DynaLoader (1.03) - Dynamically load C libraries into Perl code
   Fcntl (1.03) - load the C Fcntl.h defines
   File::Basename (2.6) - split a pathname into pieces
   (etc)

 This one is a bit crufty.  It takes some options.
 Check out the source.

=========================================================

pmdirs    - print the perl module path, newline separated

   $ pmdirs
   /home/tchrist/perllib/i686-linux
   /home/tchrist/perllib
   /usr/local/devperl/lib/5.00554/i686-linux
   /usr/local/devperl/lib/5.00554
   /usr/local/devperl/lib/site_perl/5.00554/i686-linux
   /usr/local/devperl/lib/site_perl/5.00554
   .

   $ filsperl -S pmdirs
   /home/tchrist/perllib
   /usr/local/filsperl/lib/5.00554/i686-linux-thread
   /usr/local/filsperl/lib/5.00554
   /usr/local/filsperl/lib/site_perl/5.00554/i686-linux-thread
   /usr/local/filsperl/lib/site_perl/5.00554
   .

=========================================================

plxload - show what files a given program loads at compile time

   $ plxload perldoc
   /usr/local/devperl/lib/5.00554/Exporter.pm
   /usr/local/devperl/lib/5.00554/strict.pm
   /usr/local/devperl/lib/5.00554/vars.pm
   /usr/local/devperl/lib/5.00554/i686-linux/Config.pm
   /usr/local/devperl/lib/5.00554/Getopt/Std.pm

   $ plxload /usr/src/perl5.005_54/installhtml
   /usr/local/devperl/lib/5.00554/Carp.pm
   /usr/local/devperl/lib/5.00554/Exporter.pm
   /usr/local/devperl/lib/5.00554/auto/Getopt/Long/autosplit.ix
   /usr/local/devperl/lib/5.00554/strict.pm
   /usr/local/devperl/lib/5.00554/vars.pm
   /usr/local/devperl/lib/5.00554/Pod/Functions.pm
   /usr/local/devperl/lib/5.00554/Getopt/Long.pm
   /usr/local/devperl/lib/5.00554/i686-linux/Config.pm
   /usr/local/devperl/lib/5.00554/lib.pm
   /home/tchrist/perllib/Pod/Html.pm
   /usr/local/devperl/lib/5.00554/Cwd.pm
   /usr/local/devperl/lib/5.00554/AutoLoader.pm

=========================================================

pmload - show what files a given module loads at compile time

   $ pmload IO::Handle
   /usr/local/devperl/lib/5.00554/Exporter.pm
   /usr/local/devperl/lib/5.00554/Carp.pm
   /usr/local/devperl/lib/5.00554/strict.pm
   /usr/local/devperl/lib/5.00554/vars.pm
   /usr/local/devperl/lib/5.00554/i686-linux/DynaLoader.pm
   /usr/local/devperl/lib/5.00554/i686-linux/IO/Handle.pm
   /usr/local/devperl/lib/5.00554/Symbol.pm
   /usr/local/devperl/lib/5.00554/i686-linux/IO/File.pm
   /usr/local/devperl/lib/5.00554/SelectSaver.pm
   /usr/local/devperl/lib/5.00554/i686-linux/Fcntl.pm
   /usr/local/devperl/lib/5.00554/AutoLoader.pm
   /usr/local/devperl/lib/5.00554/i686-linux/IO.pm
   /usr/local/devperl/lib/5.00554/i686-linux/IO/Seekable.pm

   $ cat `pmload IO::File` | wc -l
      3131

   $ pmload Tk
   /usr/lib/perl5/site_perl/Tk/Pretty.pm
   /usr/lib/perl5/Symbol.pm
   /usr/lib/perl5/site_perl/Tk/Frame.pm
   /usr/lib/perl5/site_perl/Tk/Toplevel.pm
   /usr/lib/perl5/strict.pm
   /usr/lib/perl5/Exporter.pm
   /usr/lib/perl5/vars.pm
   /usr/lib/perl5/site_perl/auto/Tk/Wm/autosplit.ix
   /usr/lib/perl5/site_perl/auto/Tk/Widget/autosplit.ix
   /usr/lib/perl5/site_perl/Tk.pm
   /usr/lib/perl5/i386-linux/5.00404/DynaLoader.pm
   /usr/lib/perl5/site_perl/auto/Tk/Frame/autosplit.ix
   /usr/lib/perl5/site_perl/auto/Tk/Toplevel/autosplit.ix
   /usr/lib/perl5/Carp.pm
   /usr/lib/perl5/site_perl/auto/Tk/autosplit.ix
   /usr/lib/perl5/site_perl/Tk/CmdLine.pm
   /usr/lib/perl5/site_perl/Tk/MainWindow.pm
   /usr/lib/perl5/site_perl/Tk/Submethods.pm
   /usr/lib/perl5/site_perl/Tk/Configure.pm
   /usr/lib/perl5/AutoLoader.pm
   /usr/lib/perl5/site_perl/Tk/Derived.pm
   /usr/lib/perl5/site_perl/Tk/Image.pm
   /usr/lib/perl5/site_perl/Tk/Wm.pm
   /usr/lib/perl5/site_perl/Tk/Widget.pm

=========================================================

pmexp - show a module's exports

   $ pmexp Text::ParseWords
   Text::ParseWords automatically exports shellwords, quotewords, nested_quotewords, and parse_line
   Text::ParseWords optionally exports old_shellwords

   $ pmexp Text::Wrap
   Text::Wrap automatically exports wrap and fill
   Text::Wrap optionally exports $columns, $break, and $huge

   $ pmexp Fcntl
   Fcntl automatically exports FD_CLOEXEC, F_DUPFD, F_EXLCK, F_GETFD, F_GETFL, F_GETLK, F_GETLK64, F_GETOWN, F_POSIX, F_RDLCK, F_SETFD, F_SETFL, F_SETLK, F_SETLK64, F_SETLKW, F_SETLKW64, F_SETOWN, F_SHLCK, F_UNLCK, F_WRLCK, O_ACCMODE, O_APPEND, O_ASYNC, O_BINARY, O_CREAT, O_DEFER, O_DSYNC, O_EXCL, O_EXLOCK, O_LARGEFILE, O_NDELAY, O_NOCTTY, O_NONBLOCK, O_RDONLY, O_RDWR, O_RSYNC, O_SHLOCK, O_SYNC, O_TEXT, O_TRUNC, and O_WRONLY
   Fcntl optionally exports FAPPEND, FASYNC, FCREAT, FDEFER, FEXCL, FNDELAY, FNONBLOCK, FSYNC, FTRUNC, LOCK_EX, LOCK_NB, LOCK_SH, and LOCK_UN
   Fcntl export tag `Fcompat' includes FAPPEND, FASYNC, FCREAT, FDEFER, FEXCL, FNDELAY, FNONBLOCK, FSYNC, and FTRUNC
   Fcntl export tag `flock' includes LOCK_SH, LOCK_EX, LOCK_NB, and LOCK_UN

=========================================================

pminst  - find what's installed

   $ pminst
   (lists all installed modules)

   $ pminst Carp
   CGI::Carp
   Carp

   $ pminst ^IO::
   IO::Socket::INET
   IO::Socket::UNIX
   IO::Select
   IO::Socket
   IO::Poll
   IO::Handle
   IO::Pipe
   IO::Seekable
   IO::Dir
   IO::File

   $ pminst '(?i)io'
   IO::Socket::INET
   IO::Socket::UNIX
   IO::Select
   IO::Socket
   IO::Poll
   IO::Handle
   IO::Pipe
   IO::Seekable
   IO::Dir
   IO::File
   IO
   Pod::Functions

 The -s flag provides output with the directory separated
 by a space:

   $ pminst -s | sort +1
   (lists all modules, sorted by name, but with where they
    came from)

   $ perl5.00404 -S pminst -s IO
   /usr/lib/perl5/i386-linux/5.00404 IO::File
   /usr/lib/perl5/i386-linux/5.00404 IO::Handle
   /usr/lib/perl5/i386-linux/5.00404 IO::Pipe
   /usr/lib/perl5/i386-linux/5.00404 IO::Seekable
   /usr/lib/perl5/i386-linux/5.00404 IO::Select
   /usr/lib/perl5/i386-linux/5.00404 IO::Socket
   /usr/lib/perl5/i386-linux/5.00404 IO
   /usr/lib/perl5/site_perl LWP::IO
   /usr/lib/perl5/site_perl LWP::TkIO
   /usr/lib/perl5/site_perl Tk::HTML::IO
   /usr/lib/perl5/site_perl Tk::IO
   /usr/lib/perl5/site_perl IO::Stringy
   /usr/lib/perl5/site_perl IO::Wrap
   /usr/lib/perl5/site_perl IO::ScalarArray
   /usr/lib/perl5/site_perl IO::Scalar
   /usr/lib/perl5/site_perl IO::Lines
   /usr/lib/perl5/site_perl IO::WrapTie
   /usr/lib/perl5/site_perl IO::AtomicFile

 The -l flag gives full paths:

   $ filsperl -S pminst -l Thread
   /usr/local/filsperl/lib/5.00554/i686-linux-thread/Thread/Queue.pm
   /usr/local/filsperl/lib/5.00554/i686-linux-thread/Thread/Semaphore.pm
   /usr/local/filsperl/lib/5.00554/i686-linux-thread/Thread/Signal.pm
   /usr/local/filsperl/lib/5.00554/i686-linux-thread/Thread/Specific.pm
   /usr/local/filsperl/lib/5.00554/i686-linux-thread/Thread.pm


=========================================================

pmeth - list a class's methods, recursively

   $ pmeth IO::Socket
   AF_INET
   AF_UNIX
   INADDR_ANY
   INADDR_BROADCAST
   INADDR_LOOPBACK
   INADDR_NONE
   SOCK_DGRAM
   SOCK_RAW
   SOCK_STREAM
   accept
   bind
   carp
   confess
   configure
   connect
   connected
   croak
   getsockopt
   import
   inet_aton
   inet_ntoa
   listen
   new
   pack_sockaddr_in
   pack_sockaddr_un
   peername
   protocol
   recv
   register_domain
   send
   setsockopt
   shutdown
   sockaddr_in
   sockaddr_un
   sockdomain
   socket
   socketpair
   sockname
   sockopt
   socktype
   timeout
   unpack_sockaddr_in
   unpack_sockaddr_un
   DESTROY via IO::Handle
   SEEK_CUR via IO::Handle
   SEEK_END via IO::Handle
   SEEK_SET via IO::Handle
   _IOFBF via IO::Handle
   _IOLBF via IO::Handle
   _IONBF via IO::Handle
   _open_mode_string via IO::Handle
   autoflush via IO::Handle
   blocking via IO::Handle
   [overridden] carp via IO::Handle
   clearerr via IO::Handle
   close via IO::Handle
   [overridden] confess via IO::Handle
   constant via IO::Handle
   [overridden] croak via IO::Handle
   eof via IO::Handle
   error via IO::Handle
   fcntl via IO::Handle
   fdopen via IO::Handle
   fileno via IO::Handle
   flush via IO::Handle
   format_formfeed via IO::Handle
   format_line_break_characters via IO::Handle
   format_lines_left via IO::Handle
   format_lines_per_page via IO::Handle
   format_name via IO::Handle
   format_page_number via IO::Handle
   format_top_name via IO::Handle
   format_write via IO::Handle
   formline via IO::Handle
   gensym via IO::Handle
   getc via IO::Handle
   getline via IO::Handle
   getlines via IO::Handle
   gets via IO::Handle
   input_line_number via IO::Handle
   input_record_separator via IO::Handle
   ioctl via IO::Handle
   [overridden] new via IO::Handle
   new_from_fd via IO::Handle
   opened via IO::Handle
   output_field_separator via IO::Handle
   output_record_separator via IO::Handle
   print via IO::Handle
   printf via IO::Handle
   printflush via IO::Handle
   qualify via IO::Handle
   qualify_to_ref via IO::Handle
   read via IO::Handle
   setbuf via IO::Handle
   setvbuf via IO::Handle
   stat via IO::Handle
   sync via IO::Handle
   sysread via IO::Handle
   syswrite via IO::Handle
   truncate via IO::Handle
   ungensym via IO::Handle
   ungetc via IO::Handle
   untaint via IO::Handle
   write via IO::Handle
   _push_tags via Exporter via IO::Handle
   export via Exporter via IO::Handle
   export_fail via Exporter via IO::Handle
   export_ok_tags via Exporter via IO::Handle
   export_tags via Exporter via IO::Handle
   export_to_level via Exporter via IO::Handle
   [overridden] import via Exporter via IO::Handle
   require_version via Exporter via IO::Handle
   VERSION via UNIVERSAL
   can via UNIVERSAL
   [overridden] import via UNIVERSAL
   isa via UNIVERSAL

You might want to send that through grep or grep -v looking
for "via" or "overridden".

=========================================================

pmls  - long list the module path

   $ pmls CGI
   -r--r--r--   1 root     root       190901 Dec  6 03:19
               /usr/local/devperl/lib/5.00554/CGI.pm

This is mostly here for people too lazy to type
   $ ls -l `pmpath CGI`

=========================================================

pmcat  - cat the module source through your pager

   $ pmcat CGI

This is mostly here for people too lazy to type
   $ more `pmpath CGI`

=========================================================

pman - show the module's pod docs

   $ pman CGI
   $ pman Curses

This is mostly here for people too lazy to type
   $ pod2text `pmpath CGI` | more

=========================================================

pmfunc - show a function source code from a module

   $ pmfunc Cwd::getcwd
   sub getcwd
   {
       abs_path('.');
   }

This is mostly here for people who are too lazy to type

   sed '/^sub getcwd/,/}/p' `pmpath Cwd`
or
   perl -ne 'print if /^sub\s+getcwd\b/ .. /}/' `pmpath Cwd`

=========================================================

podgrep - grep in pods of a file

 Flags:
     -i means case insensitive match
     -p means page output
     -f means format output
     -h means check for matches in pod =head and =item headers alone,
        and to keep printing podagraphs until the next header is found.

   $ podgrep mail `pmpath CGI`
   (prints out podagraphs from the CGI.pm manpage that mention mail)

   $ podgrep -i destructor `sitepods`
   (prints out podagraphs that mention destructors in the
    site-installed pods)

   $ podgrep -i 'type.?glob' `stdpods`

   (prints out podagraphs that mention typeglob in the
    standard pods)

   $ podgrep -hpfi "lock" `faqpods`

   (prints out all podagraphs with "lock" in the headers
   case-insensitively, then then formats these with pod2text, then
   shows them in the pager with matches high-lighted)

   $ podgrep -fh seek `podpath perlfunc`
   (prints out and formats podagraphs from the standard perlfunc manpage
   whose headers or items contain "seek".)

=========================================================

pfcat - show pods from perlfunc

(uses podgrep, uses those options)

   $ pfcat seek

is like

   $ podgrep -h seek `podpath perlfunc`

Whereas

   $ pfcat -pf seek

is like

   $ podgrep -pfh seek `podpath perlfunc`

which is like

   $ podgrep -h seek `podpath perlfunc` | podtext | $PAGER +/seek


=========================================================

podtoc - list table of contents of a podpage

   $ podtoc `pmpath CGI`
    NAME
    SYNOPSIS
    ABSTRACT
    DESCRIPTION
        PROGRAMMING STYLE
        CALLING CGI.PM ROUTINES
        *  1. Use another name for the argument, if one is available.  For
           example, -value is an alias for -values.
        *  2. Change the capitalization, e.g. -Values
   (etc)

=========================================================

podpath - show full path of pod file

(like pmpath, but works on standard manpages, too)

   $ podpath Cwd
   /usr/local/devperl/lib/5.00554/Cwd.pm

   $ devperl -S podpath perlfunc
   /usr/local/devperl/lib/5.00554/pod/perlfunc.pod

   $ oldperl -S podpath IO::Handle
   /usr/lib/perl5/i386-linux/5.00404/IO/Handle.pm

   $ filsperl -S podpath Thread
   /usr/local/filsperl/lib/5.00554/i686-linux-thread/Thread.pm


=========================================================

pods - list all standard pods and module pods

   $ pods

=========================================================

sitepods - list only pods in site_perl directories

   $ sitepods
   /usr/local/devperl/lib/site_perl/5.00554/i686-linux/XML/Parser/Expat.pm
   /usr/local/devperl/lib/site_perl/5.00554/i686-linux/XML/Parser.pm


=========================================================

basepods - list only normal "man-page" style pods

   $ basepods | grep delt
   /usr/local/devperl/lib/5.00554/pod/perl5004delta.pod
   /usr/local/devperl/lib/5.00554/pod/perl5005delta.pod
   /usr/local/devperl/lib/5.00554/pod/perldelta.pod


=========================================================

faqpods - list only faq pods

=========================================================

modpods - all module pods, including site_perl ones

=========================================================

stdpods - list standard pods, not site_perl ones