home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 May / Chip_2000-05_cd1.bin / zkuste / Perl / ActivePerl-5.6.0.613.msi / 䆊䌷䈹䈙䏵-䞅䞆䞀㡆䞃䄦䠥 / _f19715f8e19ffb395af1ce8a5adfecb1 < prev    next >
Text File  |  2000-03-24  |  23KB  |  827 lines

  1. @rem = '--*-Perl-*--
  2. @echo off
  3. if "%OS%" == "Windows_NT" goto WinNT
  4. perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
  5. goto endofperl
  6. :WinNT
  7. perl -x -S "%0" %*
  8. if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
  9. if %errorlevel% == 9009 echo You do not have Perl in your PATH.
  10. if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
  11. goto endofperl
  12. @rem ';
  13. #!perl
  14. #line 15
  15.     eval 'exec D:\p4-view\main\Apps\Gecko\MSI\data\ActivePerl\Perl\bin\perl.exe -S $0 ${1+"$@"}'
  16.     if 0;
  17.  
  18. use warnings;
  19. use strict;
  20.  
  21. # make sure creat()s are neither too much nor too little
  22. INIT { eval { umask(0077) } }   # doubtless someone has no mask
  23.  
  24. my @pagers = ();
  25. push @pagers, "more /e" if -x "more /e";
  26.  
  27.  
  28. use Fcntl;    # for sysopen
  29. use Getopt::Std;
  30. use Config '%Config';
  31.  
  32. #
  33. # Perldoc revision #1 -- look up a piece of documentation in .pod format that
  34. # is embedded in the perl installation tree.
  35. #
  36. # This is not to be confused with Tom Christiansen's perlman, which is a
  37. # man replacement, written in perl. This perldoc is strictly for reading
  38. # the perl manuals, though it too is written in perl.
  39. # Massive security and correctness patches applied to this
  40. # noisome program by Tom Christiansen Sat Mar 11 15:22:33 MST 2000 
  41.  
  42. if (@ARGV<1) {
  43.     my $me = $0;        # Editing $0 is unportable
  44.     $me =~ s,.*/,,;
  45.     die <<EOF;
  46. Usage: $me [-h] [-r] [-i] [-v] [-t] [-u] [-m] [-n program] [-l] [-F] [-X] PageName|ModuleName|ProgramName
  47.        $me -f PerlFunc
  48.        $me -q FAQKeywords
  49.  
  50. The -h option prints more help.  Also try "perldoc perldoc" to get
  51. acquainted with the system.
  52. EOF
  53. }
  54.  
  55. my @global_found = ();
  56. my $global_target = "";
  57.  
  58. my $Is_VMS = $^O eq 'VMS';
  59. my $Is_MSWin32 = $^O eq 'MSWin32';
  60. my $Is_Dos = $^O eq 'dos';
  61.  
  62. sub usage{
  63.     warn "@_\n" if @_;
  64.     # Erase evidence of previous errors (if any), so exit status is simple.
  65.     $! = 0;
  66.     die <<EOF;
  67. perldoc [options] PageName|ModuleName|ProgramName...
  68. perldoc [options] -f BuiltinFunction
  69. perldoc [options] -q FAQRegex
  70.  
  71. Options:
  72.     -h   Display this help message
  73.     -r   Recursive search (slow)
  74.     -i   Ignore case
  75.     -t   Display pod using pod2text instead of pod2man and nroff
  76.              (-t is the default on win32)
  77.     -u     Display unformatted pod text
  78.     -m   Display module's file in its entirety
  79.     -n   Specify replacement for nroff
  80.     -l   Display the module's file name
  81.     -F   Arguments are file names, not modules
  82.     -v     Verbosely describe what's going on
  83.     -X     use index if present (looks for pod.idx at $Config{archlib})
  84.     -q   Search the text of questions (not answers) in perlfaq[1-9]
  85.     -U     Run in insecure mode (superuser only)
  86.  
  87. PageName|ModuleName...
  88.          is the name of a piece of documentation that you want to look at. You
  89.          may either give a descriptive name of the page (as in the case of
  90.          `perlfunc') the name of a module, either like `Term::Info',
  91.          `Term/Info', the partial name of a module, like `info', or
  92.          `makemaker', or the name of a program, like `perldoc'.
  93.  
  94. BuiltinFunction
  95.          is the name of a perl function.  Will extract documentation from
  96.          `perlfunc'.
  97.  
  98. FAQRegex
  99.          is a regex. Will search perlfaq[1-9] for and extract any
  100.          questions that match.
  101.  
  102. Any switches in the PERLDOC environment variable will be used before the
  103. command line arguments.  The optional pod index file contains a list of
  104. filenames, one per line.
  105.  
  106. EOF
  107. }
  108.  
  109. if (defined $ENV{"PERLDOC"}) {
  110.     require Text::ParseWords;
  111.     unshift(@ARGV, Text::ParseWords::shellwords($ENV{"PERLDOC"}));
  112. }
  113.  
  114. use vars qw( $opt_m $opt_h $opt_t $opt_l $opt_u $opt_v $opt_r $opt_i $opt_F $opt_f $opt_X $opt_q $opt_n $opt_U );
  115.  
  116. getopts("mhtluvriFf:Xq:n:U") || usage;
  117.  
  118. usage if $opt_h;
  119.  
  120. # refuse to run if we should be tainting and aren't
  121. # (but regular users deserve protection too, though!)
  122. if (!($Is_VMS || $Is_MSWin32 || $Is_Dos) && ($> == 0 || $< == 0)
  123.      && !am_taint_checking()) 
  124. {{
  125.     if ($opt_U) {
  126.         my $id = eval { getpwnam("nobody") };
  127.            $id = eval { getpwnam("nouser") } unless defined $id;
  128.            $id = -2 unless defined $id;
  129.         eval {
  130.             $> = $id;  # must do this one first!
  131.             $< = $id;
  132.         };
  133.         last if !$@ && $< && $>;
  134.     }
  135.     die "Superuser must not run $0 without security audit and taint checks.\n";
  136. }}
  137.  
  138. $opt_n = "nroff" if !$opt_n;
  139.  
  140. my $podidx;
  141. if ($opt_X) {
  142.     $podidx = "$Config{'archlib'}/pod.idx";
  143.     $podidx = "" unless -f $podidx && -r _ && -M _ <= 7;
  144. }
  145.  
  146. if ((my $opts = do{ no warnings; $opt_t + $opt_u + $opt_m + $opt_l }) > 1) {
  147.     usage("only one of -t, -u, -m or -l")
  148. }
  149. elsif ($Is_MSWin32
  150.        || $Is_Dos
  151.        || !($ENV{TERM} && $ENV{TERM} !~ /dumb|emacs|none|unknown/i))
  152. {
  153.     $opt_t = 1 unless $opts;
  154. }
  155.  
  156. if ($opt_t) { require Pod::Text; import Pod::Text; }
  157.  
  158. my @pages;
  159. if ($opt_f) {
  160.     @pages = ("perlfunc");
  161. }
  162. elsif ($opt_q) {
  163.     @pages = ("perlfaq1" .. "perlfaq9");
  164. }
  165. else {
  166.     @pages = @ARGV;
  167. }
  168.  
  169. # Does this look like a module or extension directory?
  170. if (-f "Makefile.PL") {
  171.  
  172.     # Add ., lib to @INC (if they exist)
  173.     eval q{ use lib qw(. lib); 1; } or die;
  174.  
  175.     # don't add if superuser
  176.     if ($< && $>) {   # don't be looking too hard now!
  177.     eval q{ use blib; 1 } or die;
  178.     }
  179. }
  180.  
  181. sub containspod {
  182.     my($file, $readit) = @_;
  183.     return 1 if !$readit && $file =~ /\.pod\z/i;
  184.     local($_);
  185.     open(TEST,"<", $file)     or die "Can't open $file: $!";
  186.     while (<TEST>) {
  187.     if (/^=head/) {
  188.         close(TEST)     or die "Can't close $file: $!";
  189.         return 1;
  190.     }
  191.     }
  192.     close(TEST)         or die "Can't close $file: $!";
  193.     return 0;
  194. }
  195.  
  196. sub minus_f_nocase {
  197.      my($dir,$file) = @_;
  198.      my $path = join('/',$dir,$file);    # XXX: dirseps
  199.      return $path if -f $path and -r _;
  200.      if (!$opt_i or $Is_VMS or $Is_MSWin32 or $Is_Dos or $^O eq 'os2') {
  201.         # on a case-forgiving file system or if case is important
  202.     # that is it all we can do
  203.     warn "Ignored $path: unreadable\n" if -f _;
  204.     return '';
  205.      }
  206.      local *DIR;
  207.      # this is completely wicked.  don't mess with $", and if 
  208.      # you do, don't assume / is the dirsep!
  209.      local($")="/";
  210.      my @p = ($dir);
  211.      my($p,$cip);
  212.      foreach $p (split(m!/!, $file)){    # XXX: dirseps
  213.     my $try = "@p/$p";
  214.     stat $try;
  215.      if (-d _) {
  216.          push @p, $p;
  217.         if ( $p eq $global_target) {
  218.         my $tmp_path = join ('/', @p);  # XXX: dirseps
  219.         my $path_f = 0;
  220.         for (@global_found) {
  221.             $path_f = 1 if $_ eq $tmp_path;
  222.         }
  223.         push (@global_found, $tmp_path) unless $path_f;
  224.         print STDERR "Found as @p but directory\n" if $opt_v;
  225.         }
  226.      }
  227.     elsif (-f _ && -r _) {
  228.          return $try;
  229.      }
  230.     elsif (-f _) {
  231.         warn "Ignored $try: unreadable\n";
  232.      }
  233.     elsif (-d "@p") {
  234.          my $found=0;
  235.          my $lcp = lc $p;
  236.          opendir DIR, "@p"         or die "opendir @p: $!";
  237.          while ($cip=readdir(DIR)) {
  238.          if (lc $cip eq $lcp){
  239.              $found++;
  240.              last;
  241.          }
  242.          }
  243.          closedir DIR        or die "closedir @p: $!";
  244.          return "" unless $found;
  245.          push @p, $cip;
  246.          return "@p" if -f "@p" and -r _;
  247.         warn "Ignored @p: unreadable\n" if -f _;
  248.      }
  249.      }
  250.      return "";
  251. }
  252.  
  253.  
  254. sub check_file {
  255.     my($dir,$file) = @_;
  256.     return "" if length $dir and not -d $dir;
  257.     if ($opt_m) {
  258.     return minus_f_nocase($dir,$file);
  259.     }
  260.     else {
  261.     my $path = minus_f_nocase($dir,$file);
  262.         return $path if length $path and containspod($path);
  263.     }
  264.     return "";
  265. }
  266.  
  267.  
  268. sub searchfor {
  269.     my($recurse,$s,@dirs) = @_;
  270.     $s =~ s!::!/!g;
  271.     $s = VMS::Filespec::unixify($s) if $Is_VMS;
  272.     return $s if -f $s && containspod($s);
  273.     printf STDERR "Looking for $s in @dirs\n" if $opt_v;
  274.     my $ret;
  275.     my $i;
  276.     my $dir;
  277.     $global_target = (split(m!/!, $s))[-1];   # XXX: dirseps
  278.     for ($i=0; $i<@dirs; $i++) {
  279.     $dir = $dirs[$i];
  280.     ($dir = VMS::Filespec::unixpath($dir)) =~ s!/\z!! if $Is_VMS;
  281.     if (       ( $ret = check_file $dir,"$s.pod")
  282.         or ( $ret = check_file $dir,"$s.pm")
  283.         or ( $ret = check_file $dir,$s)
  284.         or ( $Is_VMS and
  285.              $ret = check_file $dir,"$s.com")
  286.         or ( $^O eq 'os2' and
  287.              $ret = check_file $dir,"$s.cmd")
  288.         or ( ($Is_MSWin32 or $Is_Dos or $^O eq 'os2') and
  289.              $ret = check_file $dir,"$s.bat")
  290.         or ( $ret = check_file "$dir/pod","$s.pod")
  291.         or ( $ret = check_file "$dir/pod",$s)
  292.         or ( $ret = check_file "$dir/pods","$s.pod")
  293.         or ( $ret = check_file "$dir/pods",$s)
  294.     ) {
  295.         return $ret;
  296.     }
  297.  
  298.     if ($recurse) {
  299.         opendir(D,$dir)    or die "Can't opendir $dir: $!";
  300.         my @newdirs = map "$dir/$_", grep {  # XXX: dirseps
  301.         not /^\.\.?\z/s and
  302.         not /^auto\z/s  and   # save time! don't search auto dirs
  303.         -d  "$dir/$_"  # XXX: dirseps
  304.         } readdir D;
  305.         closedir(D)        or die "Can't closedir $dir: $!";
  306.         next unless @newdirs;
  307.         # what a wicked map!
  308.         @newdirs = map((s/\.dir\z//,$_)[1],@newdirs) if $Is_VMS;
  309.         print STDERR "Also looking in @newdirs\n" if $opt_v;
  310.         push(@dirs,@newdirs);
  311.     }
  312.     }
  313.     return ();
  314. }
  315.  
  316. sub filter_nroff {
  317.   my @data = split /\n{2,}/, shift;
  318.   shift @data while @data and $data[0] !~ /\S/; # Go to header
  319.   shift @data if @data and $data[0] =~ /Contributed\s+Perl/; # Skip header
  320.   pop @data if @data and $data[-1] =~ /^\w/; # Skip footer, like
  321.                 # 28/Jan/99 perl 5.005, patch 53 1
  322.   join "\n\n", @data;
  323. }
  324.  
  325. sub printout {
  326.     my ($file, $tmp, $filter) = @_;
  327.     my $err;
  328.  
  329.     if ($opt_t) {
  330.     # why was this append?
  331.     sysopen(OUT, $tmp, O_WRONLY | O_EXCL | O_CREAT, 0600)
  332.         or die ("Can't open $tmp: $!");
  333.     Pod::Text->new()->parse_from_file($file,\*OUT);
  334.     close OUT   or die "can't close $tmp: $!";
  335.     }
  336.     elsif (not $opt_u) {
  337.     my $cmd = "pod2man --lax $file | $opt_n -man";
  338.     $cmd .= " | col -x" if $^O =~ /hpux/;
  339.     my $rslt = `$cmd`;
  340.     $rslt = filter_nroff($rslt) if $filter;
  341.     unless (($err = $?)) {
  342.         # why was this append?
  343.         sysopen(TMP, $tmp, O_WRONLY | O_EXCL | O_CREAT, 0600)
  344.         or die "Can't open $tmp: $!";
  345.         print TMP $rslt
  346.         or die "Can't print $tmp: $!";
  347.         close TMP
  348.         or die "Can't close $tmp: $!";
  349.     }
  350.     }
  351.     if ($opt_u or $err or -z $tmp) {  # XXX: race with -z
  352.     # why was this append?
  353.     sysopen(OUT, $tmp, O_WRONLY | O_EXCL | O_CREAT, 0600)
  354.         or die "Can't open $tmp: $!";
  355.     open(IN,"<", $file)   or die("Can't open $file: $!");
  356.     my $cut = 1;
  357.     local $_;
  358.     while (<IN>) {
  359.         $cut = $1 eq 'cut' if /^=(\w+)/;
  360.         next if $cut;
  361.         print OUT
  362.         or die "Can't print $tmp: $!";
  363.     }
  364.     close IN    or die "Can't close $file: $!";
  365.     close OUT   or die "Can't close $tmp: $!";
  366.     }
  367. }
  368.  
  369. sub page {
  370.     my ($tmp, $no_tty, @pagers) = @_;
  371.     if ($no_tty) {
  372.     open(TMP,"<", $tmp)     or die "Can't open $tmp: $!";
  373.     local $_;
  374.     while (<TMP>) {
  375.         print or die "Can't print to stdout: $!";
  376.     } 
  377.     close TMP        or die "Can't close while $tmp: $!";
  378.     }
  379.     else {
  380.     foreach my $pager (@pagers) {
  381.         last if system("$pager $tmp") == 0;
  382.     }
  383.     }
  384. }
  385.  
  386. sub cleanup {
  387.     my @files = @_;
  388.     for (@files) {
  389.     if ($Is_VMS) { 
  390.         1 while unlink($_);    # XXX: expect failure
  391.     } else {
  392.         unlink($_);           # or die "Can't unlink $_: $!";
  393.     } 
  394.     }
  395. }
  396.  
  397. my @found;
  398. foreach (@pages) {
  399.     if ($podidx && open(PODIDX, $podidx)) {
  400.     my $searchfor = $_;
  401.     $searchfor =~ s,::,/,g;        # XXX: dirseps
  402.     print STDERR "Searching for '$searchfor' in $podidx\n" if $opt_v;
  403.     local $_;
  404.     while (<PODIDX>) {
  405.         chomp;
  406.         push(@found, $_) if m,/$searchfor(?:\.(?:pod|pm))?\z,i;
  407.     }
  408.     close(PODIDX)        or die "Can't close $podidx: $!";
  409.     next;
  410.     }
  411.     print STDERR "Searching for $_\n" if $opt_v;
  412.     # We must look both in @INC for library modules and in PATH
  413.     # for executables, like h2xs or perldoc itself.
  414.     my @searchdirs = @INC;
  415.     if ($opt_F) {
  416.     next unless -r;
  417.     push @found, $_ if $opt_m or containspod($_);
  418.     next;
  419.     }
  420.     unless ($opt_m) {
  421.     if ($Is_VMS) {
  422.         my($i,$trn);
  423.         for ($i = 0; $trn = $ENV{'DCL$PATH;'.$i}; $i++) {
  424.         push(@searchdirs,$trn);
  425.         }
  426.         push(@searchdirs,'perl_root:[lib.pod]')  # installed pods
  427.     }
  428.     else {
  429.         push(@searchdirs, grep(-d, split($Config{path_sep},
  430.                          $ENV{'PATH'})));
  431.     }
  432.     }
  433.     my @files = searchfor(0,$_,@searchdirs);
  434.     if (@files) {
  435.     print STDERR "Found as @files\n" if $opt_v;
  436.     }
  437.     else {
  438.     # no match, try recursive search
  439.     @searchdirs = grep(!/^\.\z/s,@INC);
  440.     @files= searchfor(1,$_,@searchdirs) if $opt_r;
  441.     if (@files) {
  442.         print STDERR "Loosely found as @files\n" if $opt_v;
  443.     }
  444.     else {
  445.         print STDERR "No documentation found for \"$_\".\n";
  446.         if (@global_found) {
  447.         print STDERR "However, try\n";
  448.         for my $dir (@global_found) {
  449.             opendir(DIR, $dir) or die "opendir $dir: $!";
  450.             while (my $file = readdir(DIR)) {
  451.             next if ($file =~ /^\./s);
  452.             $file =~ s/\.(pm|pod)\z//;  # XXX: badfs
  453.             print STDERR "\tperldoc $_\::$file\n";
  454.             }
  455.             closedir DIR    or die "closedir $dir: $!";
  456.         }
  457.         }
  458.     }
  459.     }
  460.     push(@found,@files);
  461. }
  462.  
  463. if (!@found) {
  464.     exit ($Is_VMS ? 98962 : 1);
  465. }
  466.  
  467. if ($opt_l) {
  468.     print join("\n", @found), "\n";
  469.     exit;
  470. }
  471.  
  472. my $lines = $ENV{LINES} || 24;
  473.  
  474. my $no_tty;
  475. if (! -t STDOUT) { $no_tty = 1 }
  476. END { close(STDOUT) || die "Can't close STDOUT: $!" }
  477.  
  478. # until here we could simply exit or die
  479. # now we create temporary files that we have to clean up
  480. # namely $tmp, $buffer
  481. # that's because you did it wrong, should be descriptor based --tchrist
  482.  
  483. my $tmp;
  484. my $buffer;
  485. if ($Is_MSWin32) {
  486.     $tmp = "$ENV{TEMP}\\perldoc1.$$";
  487.     $buffer = "$ENV{TEMP}\\perldoc1.b$$";
  488.     push @pagers, qw( more< less notepad );
  489.     unshift @pagers, $ENV{PAGER}  if $ENV{PAGER};
  490.     for (@found) { s,/,\\,g }
  491. }
  492. elsif ($Is_VMS) {
  493.     $tmp = 'Sys$Scratch:perldoc.tmp1_'.$$;
  494.     $buffer = 'Sys$Scratch:perldoc.tmp1_b'.$$;
  495.     push @pagers, qw( most more less type/page );
  496. }
  497. elsif ($Is_Dos) {
  498.     $tmp = "$ENV{TEMP}/perldoc1.$$";
  499.     $buffer = "$ENV{TEMP}/perldoc1.b$$";
  500.     $tmp =~ tr!\\/!//!s;
  501.     $buffer =~ tr!\\/!//!s;
  502.     push @pagers, qw( less.exe more.com< );
  503.     unshift @pagers, $ENV{PAGER}  if $ENV{PAGER};
  504. }
  505. else {
  506.     if ($^O eq 'os2') {
  507.       require POSIX;
  508.       $tmp = POSIX::tmpnam();
  509.       $buffer = POSIX::tmpnam();
  510.       unshift @pagers, 'less', 'cmd /c more <';
  511.     }
  512.     else {
  513.       # XXX: this is not secure, because it doesn't open it
  514.       ($tmp, $buffer) = eval { require POSIX } 
  515.         ? (POSIX::tmpnam(),    POSIX::tmpnam()     )
  516.         : ("/tmp/perldoc1.$$", "/tmp/perldoc1.b$$" );
  517.     }
  518.     push @pagers, qw( more less pg view cat );
  519.     unshift @pagers, $ENV{PAGER}  if $ENV{PAGER};
  520. }
  521. unshift @pagers, $ENV{PERLDOC_PAGER} if $ENV{PERLDOC_PAGER};
  522.  
  523. # make sure cleanup called
  524. eval q{
  525.     sub END { cleanup($tmp, $buffer) } 
  526.     1;
  527. } || die;
  528. eval q{ use sigtrap qw(die INT TERM HUP QUIT) };
  529.  
  530. if ($opt_m) {
  531.     foreach my $pager (@pagers) {
  532.     if (system($pager, @found) == 0) {
  533.         exit;
  534.     }
  535.     }
  536.     if ($Is_VMS) { 
  537.     eval q{
  538.         use vmsish qw(status exit); 
  539.         exit $?;
  540.         1;
  541.     } or die;
  542.     }
  543.     exit(1);
  544. }
  545.  
  546. my @pod;
  547. if ($opt_f) {
  548.     my $perlfunc = shift @found;
  549.     open(PFUNC, "<", $perlfunc)
  550.     or die("Can't open $perlfunc: $!");
  551.  
  552.     # Functions like -r, -e, etc. are listed under `-X'.
  553.     my $search_string = ($opt_f =~ /^-[rwxoRWXOeszfdlpSbctugkTBMAC]$/)
  554.             ? 'I<-X' : $opt_f ;
  555.  
  556.     # Skip introduction
  557.     local $_;
  558.     while (<PFUNC>) {
  559.     last if /^=head2 Alphabetical Listing of Perl Functions/;
  560.     }
  561.  
  562.     # Look for our function
  563.     my $found = 0;
  564.     my $inlist = 0;
  565.     while (<PFUNC>) {
  566.     if (/^=item\s+\Q$search_string\E\b/o)  {
  567.         $found = 1;
  568.     }
  569.     elsif (/^=item/) {
  570.         last if $found > 1 and not $inlist;
  571.     }
  572.     next unless $found;
  573.     if (/^=over/) {
  574.         ++$inlist;
  575.     }
  576.     elsif (/^=back/) {
  577.         --$inlist;
  578.     }
  579.     push @pod, $_;
  580.     ++$found if /^\w/;    # found descriptive text
  581.     }
  582.     if (!@pod) {
  583.     die "No documentation for perl function `$opt_f' found\n";
  584.     }
  585.     close PFUNC        or die "Can't open $perlfunc: $!";
  586. }
  587.  
  588. if ($opt_q) {
  589.     local @ARGV = @found;    # I'm lazy, sue me.
  590.     my $found = 0;
  591.     my %found_in;
  592.     my $rx = eval { qr/$opt_q/ } or die <<EOD;
  593. Invalid regular expression '$opt_q' given as -q pattern:
  594.   $@
  595. Did you mean \\Q$opt_q ?
  596.  
  597. EOD
  598.  
  599.     for (@found) { die "invalid file spec: $!" if /[<>|]/ } 
  600.     local $_;
  601.     while (<>) {
  602.     if (/^=head2\s+.*(?:$opt_q)/oi) {
  603.         $found = 1;
  604.         push @pod, "=head1 Found in $ARGV\n\n" unless $found_in{$ARGV}++;
  605.     }
  606.     elsif (/^=head2/) {
  607.         $found = 0;
  608.     }
  609.     next unless $found;
  610.     push @pod, $_;
  611.     }
  612.     if (!@pod) {
  613.     die("No documentation for perl FAQ keyword `$opt_q' found\n");
  614.     }
  615. }
  616.  
  617. my $filter;
  618.  
  619. if (@pod) {
  620.     sysopen(TMP, $buffer, O_WRONLY | O_EXCL | O_CREAT)
  621.     or die("Can't open $buffer: $!");
  622.     print TMP "=over 8\n\n";
  623.     print TMP @pod    or die "Can't print $buffer: $!";
  624.     print TMP "=back\n";
  625.     close TMP        or die "Can't close $buffer: $!";
  626.     @found = $buffer;
  627.     $filter = 1;
  628. }
  629.  
  630. foreach (@found) {
  631.     printout($_, $tmp, $filter);
  632. }
  633. page($tmp, $no_tty, @pagers);
  634.  
  635. exit;
  636.  
  637. sub is_tainted {
  638.     my $arg = shift;
  639.     my $nada = substr($arg, 0, 0);  # zero-length
  640.     local $@;  # preserve caller's version
  641.     eval { eval "# $nada" };
  642.     return length($@) != 0;
  643. }
  644.  
  645. sub am_taint_checking {
  646.     my($k,$v) = each %ENV;
  647.     return is_tainted($v);  
  648. }
  649.  
  650.  
  651. __END__
  652.  
  653. =head1 NAME
  654.  
  655. perldoc - Look up Perl documentation in pod format.
  656.  
  657. =head1 SYNOPSIS
  658.  
  659. B<perldoc> [B<-h>] [B<-v>] [B<-t>] [B<-u>] [B<-m>] [B<-l>] [B<-F>]  [B<-X>] PageName|ModuleName|ProgramName
  660.  
  661. B<perldoc> B<-f> BuiltinFunction
  662.  
  663. B<perldoc> B<-q> FAQ Keyword
  664.  
  665. =head1 DESCRIPTION
  666.  
  667. I<perldoc> looks up a piece of documentation in .pod format that is embedded
  668. in the perl installation tree or in a perl script, and displays it via
  669. C<pod2man | nroff -man | $PAGER>. (In addition, if running under HP-UX,
  670. C<col -x> will be used.) This is primarily used for the documentation for
  671. the perl library modules.
  672.  
  673. Your system may also have man pages installed for those modules, in
  674. which case you can probably just use the man(1) command.
  675.  
  676. =head1 OPTIONS
  677.  
  678. =over 5
  679.  
  680. =item B<-h> help
  681.  
  682. Prints out a brief help message.
  683.  
  684. =item B<-v> verbose
  685.  
  686. Describes search for the item in detail.
  687.  
  688. =item B<-t> text output
  689.  
  690. Display docs using plain text converter, instead of nroff. This may be faster,
  691. but it won't look as nice.
  692.  
  693. =item B<-u> unformatted
  694.  
  695. Find docs only; skip reformatting by pod2*
  696.  
  697. =item B<-m> module
  698.  
  699. Display the entire module: both code and unformatted pod documentation.
  700. This may be useful if the docs don't explain a function in the detail
  701. you need, and you'd like to inspect the code directly; perldoc will find
  702. the file for you and simply hand it off for display.
  703.  
  704. =item B<-l> file name only
  705.  
  706. Display the file name of the module found.
  707.  
  708. =item B<-F> file names
  709.  
  710. Consider arguments as file names, no search in directories will be performed.
  711.  
  712. =item B<-f> perlfunc
  713.  
  714. The B<-f> option followed by the name of a perl built in function will
  715. extract the documentation of this function from L<perlfunc>.
  716.  
  717. =item B<-q> perlfaq
  718.  
  719. The B<-q> option takes a regular expression as an argument.  It will search
  720. the question headings in perlfaq[1-9] and print the entries matching
  721. the regular expression.
  722.  
  723. =item B<-X> use an index if present
  724.  
  725. The B<-X> option looks for a entry whose basename matches the name given on the
  726. command line in the file C<$Config{archlib}/pod.idx>.  The pod.idx file should
  727. contain fully qualified filenames, one per line.
  728.  
  729. =item B<-U> run insecurely
  730.  
  731. Because B<perldoc> does not run properly tainted, and is known to
  732. have security issues, it will not normally execute as the superuser.
  733. If you use the B<-U> flag, it will do so, but only after setting
  734. the effective and real IDs to nobody's or nouser's account, or -2
  735. if unavailable.  If it cannot relinguish its privileges, it will not
  736. run.  
  737.  
  738. =item B<PageName|ModuleName|ProgramName>
  739.  
  740. The item you want to look up.  Nested modules (such as C<File::Basename>)
  741. are specified either as C<File::Basename> or C<File/Basename>.  You may also
  742. give a descriptive name of a page, such as C<perlfunc>. You may also give a
  743. partial or wrong-case name, such as "basename" for "File::Basename", but
  744. this will be slower, if there is more then one page with the same partial
  745. name, you will only get the first one.
  746.  
  747. =back
  748.  
  749. =head1 ENVIRONMENT
  750.  
  751. Any switches in the C<PERLDOC> environment variable will be used before the
  752. command line arguments.  C<perldoc> also searches directories
  753. specified by the C<PERL5LIB> (or C<PERLLIB> if C<PERL5LIB> is not
  754. defined) and C<PATH> environment variables.
  755. (The latter is so that embedded pods for executables, such as
  756. C<perldoc> itself, are available.)  C<perldoc> will use, in order of
  757. preference, the pager defined in C<PERLDOC_PAGER>, C<MANPAGER>, or
  758. C<PAGER> before trying to find a pager on its own.  (C<MANPAGER> is not
  759. used if C<perldoc> was told to display plain text or unformatted pod.)
  760.  
  761. One useful value for C<PERLDOC_PAGER> is C<less -+C -E>.
  762.  
  763. =head1 VERSION
  764.  
  765. This is perldoc v2.01.
  766.  
  767. =head1 AUTHOR
  768.  
  769. Kenneth Albanowski <kjahds@kjahds.com>
  770.  
  771. Minor updates by Andy Dougherty <doughera@lafcol.lafayette.edu>,
  772. and others.
  773.  
  774. =cut
  775.  
  776. #
  777. # Version 2.02: Mon Mar 13 18:03:04 MST 2000
  778. #       Tom Christiansen <tchrist@perl.com>
  779. #    Added -U insecurity option
  780. # Version 2.01: Sat Mar 11 15:22:33 MST 2000 
  781. #       Tom Christiansen <tchrist@perl.com>, querulously.
  782. #       Security and correctness patches.
  783. #       What a twisted bit of distasteful spaghetti code.
  784. # Version 2.0: ????
  785. # Version 1.15: Tue Aug 24 01:50:20 EST 1999
  786. #       Charles Wilson <cwilson@ece.gatech.edu>
  787. #    changed /pod/ directory to /pods/ for cygwin
  788. #         to support cygwin/win32
  789. # Version 1.14: Wed Jul 15 01:50:20 EST 1998
  790. #       Robin Barker <rmb1@cise.npl.co.uk>
  791. #    -strict, -w cleanups
  792. # Version 1.13: Fri Feb 27 16:20:50 EST 1997
  793. #       Gurusamy Sarathy <gsar@activestate.com>
  794. #    -doc tweaks for -F and -X options
  795. # Version 1.12: Sat Apr 12 22:41:09 EST 1997
  796. #       Gurusamy Sarathy <gsar@activestate.com>
  797. #    -various fixes for win32
  798. # Version 1.11: Tue Dec 26 09:54:33 EST 1995
  799. #       Kenneth Albanowski <kjahds@kjahds.com>
  800. #   -added Charles Bailey's further VMS patches, and -u switch
  801. #   -added -t switch, with pod2text support
  802. #
  803. # Version 1.10: Thu Nov  9 07:23:47 EST 1995
  804. #        Kenneth Albanowski <kjahds@kjahds.com>
  805. #    -added VMS support
  806. #    -added better error recognition (on no found pages, just exit. On
  807. #     missing nroff/pod2man, just display raw pod.)
  808. #    -added recursive/case-insensitive matching (thanks, Andreas). This
  809. #     slows things down a bit, unfortunately. Give a precise name, and
  810. #     it'll run faster.
  811. #
  812. # Version 1.01:    Tue May 30 14:47:34 EDT 1995
  813. #        Andy Dougherty  <doughera@lafcol.lafayette.edu>
  814. #   -added pod documentation.
  815. #   -added PATH searching.
  816. #   -added searching pod/ subdirectory (mainly to pick up perlfunc.pod
  817. #    and friends.
  818. #
  819. #
  820. # TODO:
  821. #
  822. #    Cache directories read during sloppy match
  823.  
  824. __END__
  825. :endofperl
  826.