#!/home/merlyn/bin/perl -Tw use strict; $| = 1; ## set the path $ENV{"PATH"} = "/usr/local/bin:/usr/ucb:/bin:/usr/bin"; my $header_printed = 0; # so the death handler knows ## return $_[0] encoded for HTML entities sub ent { local $_ = shift; $_ =~ s/["<&>"]/"&#".ord($&).";"/ge; # entity escape $_; } ## death handler $SIG{"__DIE__"} = $SIG{"__WARN__"} = sub { my $why = shift; chomp $why; $why = ent $why; print "Content-type: text/html\n\n" unless $header_printed++; print "ERROR: $why\n"; exit 0; }; use CGI qw/:standard/; my $DIR = "/home/merlyn/Html/merlyn/WebTechniques"; my $URL = "http://www.stonehenge.com/merlyn/WebTechniques"; my $FILEPAT = "*.listing.txt"; print header; $header_printed++; print start_html("-title" => "Search WebTechniques Perl Scripts"); print h1("Search WebTechniques Perl Scripts"); print "Search the Perl WebTechniques programs", " by submitting this form:\n"; print hr, start_form; print p, "Search for: ", textfield("-name" => "search"); print p, checkbox("-name" => "regex", "-label" => "Use Regular Expressions"); print p, checkbox("-name" => "ignore", "-label" => "Ignore case"); print p, submit; print end_form, hr; my $searchstring = param("search"); # the search item if (defined $searchstring and length $searchstring) { chdir $DIR or die "Cannot chdir $DIR: $!"; @ARGV = glob $FILEPAT; # get matching filenames for <> unless (param("regex")) { # if ordinary string... $searchstring = quotemeta $searchstring; # make ordinary. } my $ignore = param("ignore") ? "(?i)" : ""; # make case insensitive print "

Follow the link to get the full listing:\n"; print "

\n";
  my $per_file = 0;             # how many hits this file?
  while (<>) {
    if (eof) {
      close ARGV;               # resets $.
      $per_file = 0;
    }
    chomp;
    my $per_line = 0;           # how many hits this line?
    while (s/$ignore$searchstring//o) {
      print
        '',
        ent($ARGV),":$.: "
          unless $per_line++;   # first time, print prefix
      print ent($`), b(ent $&);
      $_ = $';
      last if $per_line >= 5;   # only five hits max per line
    }
    if ($per_line) {            # at least one hit?
      print ent($_),"\n";       # finish line off
      if (++$per_file >= 5) {   # only five lines max per file
        print "[skipping to next file]\n";
        close ARGV;             # force EOF
        $per_file = 0;
      }
    }
  }
  print "
\n"; } print end_html;