return to first page linux journal archive
keywordscontents

Listing 7. simple-cgi-find.pl

#!/usr/bin/perl -w
use strict;
use diagnostics;
use File::Find;
use CGI;
use CGI::Carp qw|fatalsToBrowser|;
# Which directory should start the search?
my $search_root = "/usr/local/apache/htdocs";
# Slurp up files in one fell swoop
undef $/;
# Create an instance of CGI
my $query = new CGI;
# Send a MIME header
print $query->header("text/html");
# Get the text pattern for which to search
my $pattern = $query->param("pattern");
# Make sure that $pattern is defined
unless ($pattern)
{
    print $query->start_html(-title =>
       "No pattern named");
    print "<P>You must enter a pattern!</P>";
    print $query->end_html;
    exit;
}
# Start the HTML output
print $query->start_html(-title => "Search results");
print qq{<P>The following documents matched the
   pattern "$pattern":</P>\n};
# Start an unordered list
print "<ul>\n";
# Search for 
find(\&find_matches, $search_root);
# End an unordered list
print "</ul>\n";
print $query->end_html;
#-----------------------------------------
# Subroutine that searches through files for
# matches
sub find_matches
{
    # Make sure that this is an HTML file
    return unless m/\.html?$/i;
    # Get the filename
    my $filename = $_;
    # Open the file, and search through its
    # contents
    if (open FILE, $filename)
    {
	# Get the file
	my $contents = (<FILE>);
	# Print the filename, with the directory
	print qq{<li>$File::Find::dir/$filename\n}
	    if ($contents =~ m|\b$pattern\b|is);
	close FILE;
    }
    else 
    {
	warn qq{Unable to open "$filename": $! };
	return;
    }
}