http://www.perlmonks.org?node_id=697155
Category: Perl stuff
Author/Contact Info jacques
Description: Perl module search. Copy & paste the code to a CGI script and you are good to go. (You need to have HTML::Perlinfo installed.)

This is an updated version of the previous post, based on the latest version of HTML::Perlinfo, which fixes a security vulnerability pointed out by moritz.

I added optional fields in the search form. The program searches @INC by default, so you don't need to specify search directories, but you can if you want to now. If you look at the documentation for HTML::Perlinfo::Modules, you will see that more options are available. For example, you can add different columns or change the POD links (by default, every module is linked with search.cpan.org).

Suggestions/Code Updates Welcomed!

Thanks to Your Mother, moritz, and everyone else who responded last time.

#!/usr/bin/perl
use strict;
use warnings;
use CGI ":standard";
use POSIX qw/uname/;
use HTML::Perlinfo::Modules;

print
    header(),
    start_html(-title => "Perl Module Search on @{[ (uname)[0..2] ]}",
               -head  => style({type => 'text/css'},
                               join('',<DATA>)
                              ),
              ),
    h1("Search Perl modules on @{[ (uname)[0..2] ]}");

print
    div({-style => "float:left; width: 20%;"},
        h3("Separate names with commas"),
        start_form(-method => "get",
                   -enctype => "application/x-www-form-urlencoded",
                   -onsubmit => "return this._x ? false : ( this._x = 
+true )"),
        textfield("query"),
        br(),
        h3("Search from:"),
    textfield("from"),
    br(),
        h3("Sort modules by:"),
        radio_group(-name=>'sort',
            -values=>['Name','Version'],
            -default=>'Name'),
        p(),
        submit(),
        end_form(),
       );

if ( my $query = param("query") ) {

    my $module = HTML::Perlinfo::Modules
            ->new
            ->print_modules( show_only => [split(/, */, $query)], 
                 from      => param("from") ? param("from") : \@INC,
                             sort_by   => param("sort") eq 'Version' ?
+ 'version' : 'name',               
                             full_page => 0 );
    print
        div({-style => "float:left; width: 75%; margin-left: 2%"},
            $module || h2("No modules found"),
           );
}

print end_html();

__DATA__
body {
 font: 11px/13px helvetica-neue, helvetica, sans-serif;
 color: #001;
}
a:link {color: #000099; text-decoration: none;}
a:hover {text-decoration: underline;}
table {border-collapse: collapse; width: 100%;}
.center {text-align: center;}
.center table { margin-left: auto; margin-right: auto; text-align: lef
+t;}
.center th { text-align: center !important; }
td, th { border: 1px solid #001; }
.modules table {border: 0;}
.modules td { border:0;}
.modules th { border:0;}
.p {text-align: left;}
.e {background-color: #ccf; font-weight: bold; }
.h {background-color: #99c; font-weight: bold; }
.v {background-color: #ccc; }
i {color: #666666; background-color: #ccc;}
__END__