add option to omit Changes file, from Abigail <abigail@delanet.com>;
[p5sagit/p5-mst-13.2.git] / utils / perldoc.PL
CommitLineData
4633a7c4 1#!/usr/local/bin/perl
2
3use Config;
4use File::Basename qw(&basename &dirname);
8a5546a1 5use Cwd;
4633a7c4 6
85880f03 7# List explicitly here the variables you want Configure to
8# generate. Metaconfig only looks for shell variables, so you
9# have to mention them as if they were shell variables, not
10# %Config entries. Thus you write
4633a7c4 11# $startperl
85880f03 12# to ensure Configure will look for $Config{startperl}.
4633a7c4 13
14# This forces PL files to create target in same directory as PL file.
15# This is so that make depend always knows where to find PL derivatives.
8a5546a1 16$origdir = cwd;
44a8e56a 17chdir dirname($0);
18$file = basename($0, '.PL');
774d564b 19$file .= '.com' if $^O eq 'VMS';
4633a7c4 20
21open OUT,">$file" or die "Can't create $file: $!";
22
23print "Extracting $file (with variable substitutions)\n";
24
25# In this section, perl variables will be expanded during extraction.
26# You can use $Config{...} to use Configure variables.
27
85880f03 28print OUT <<"!GROK!THIS!";
5f05dabc 29$Config{startperl}
30 eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
c5ae3962 31 if 0;
55497cff 32
c5ae3962 33use strict;
34my \@pagers = ();
55497cff 35push \@pagers, "$Config{'pager'}" if -x "$Config{'pager'}";
4633a7c4 36!GROK!THIS!
37
38# In the following, perl variables are not expanded during extraction.
39
40print OUT <<'!NO!SUBS!';
41
42#
43# Perldoc revision #1 -- look up a piece of documentation in .pod format that
44# is embedded in the perl installation tree.
45#
46# This is not to be confused with Tom Christianson's perlman, which is a
47# man replacement, written in perl. This perldoc is strictly for reading
48# the perl manuals, though it too is written in perl.
4633a7c4 49
febd60db 50if (@ARGV<1) {
c5ae3962 51 my $me = $0; # Editing $0 is unportable
fb73857a 52 $me =~ s,.*/,,;
4633a7c4 53 die <<EOF;
5315ba28 54Usage: $me [-h] [-r] [-i] [-v] [-t] [-u] [-m] [-l] [-F] [-X] PageName|ModuleName|ProgramName
0b166b66 55 $me -f PerlFunc
a3cb178b 56 $me -q FAQKeywords
4633a7c4 57
89b8affa 58The -h option prints more help. Also try "perldoc perldoc" to get
59aquainted with the system.
4633a7c4 60EOF
61}
62
63use Getopt::Std;
59586d77 64use Config '%Config';
65
c5ae3962 66my @global_found = ();
67my $global_target = "";
fb73857a 68
c5ae3962 69my $Is_VMS = $^O eq 'VMS';
70my $Is_MSWin32 = $^O eq 'MSWin32';
71my $Is_Dos = $^O eq 'dos';
4633a7c4 72
73sub usage{
ff0cee69 74 warn "@_\n" if @_;
75 # Erase evidence of previous errors (if any), so exit status is simple.
76 $! = 0;
4633a7c4 77 die <<EOF;
31bdbec1 78perldoc [options] PageName|ModuleName|ProgramName...
79perldoc [options] -f BuiltinFunction
a3cb178b 80perldoc [options] -q FAQRegex
31bdbec1 81
82Options:
137443ea 83 -h Display this help message
5315ba28 84 -r Recursive search (slow)
febd60db 85 -i Ignore case
137443ea 86 -t Display pod using pod2text instead of pod2man and nroff
87 (-t is the default on win32)
85880f03 88 -u Display unformatted pod text
a3cb178b 89 -m Display module's file in its entirety
90 -l Display the module's file name
cce34969 91 -F Arguments are file names, not modules
137443ea 92 -v Verbosely describe what's going on
89b8affa 93 -X use index if present (looks for pod.idx at $Config{archlib})
54ac30b1 94 -q Search the text of questions (not answers) in perlfaq[1-9]
a3cb178b 95
4633a7c4 96PageName|ModuleName...
febd60db 97 is the name of a piece of documentation that you want to look at. You
4633a7c4 98 may either give a descriptive name of the page (as in the case of
febd60db 99 `perlfunc') the name of a module, either like `Term::Info',
100 `Term/Info', the partial name of a module, like `info', or
4633a7c4 101 `makemaker', or the name of a program, like `perldoc'.
31bdbec1 102
103BuiltinFunction
104 is the name of a perl function. Will extract documentation from
105 `perlfunc'.
a3cb178b 106
107FAQRegex
108 is a regex. Will search perlfaq[1-9] for and extract any
109 questions that match.
110
febd60db 111Any switches in the PERLDOC environment variable will be used before the
89b8affa 112command line arguments. The optional pod index file contains a list of
113filenames, one per line.
4633a7c4 114
115EOF
116}
117
febd60db 118if (defined $ENV{"PERLDOC"}) {
c5ae3962 119 require Text::ParseWords;
120 unshift(@ARGV, Text::ParseWords::shellwords($ENV{"PERLDOC"}));
121}
122!NO!SUBS!
123
124my $getopts = "mhtluvriFf:Xq:";
125print OUT <<"!GET!OPTS!";
4633a7c4 126
c5ae3962 127use vars qw( @{[map "\$opt_$_", ($getopts =~ /\w/g)]} );
4633a7c4 128
c5ae3962 129getopts("$getopts") || usage;
130!GET!OPTS!
4633a7c4 131
c5ae3962 132print OUT <<'!NO!SUBS!';
85880f03 133
c5ae3962 134usage if $opt_h;
4633a7c4 135
c5ae3962 136my $podidx;
febd60db 137if ($opt_X) {
0d3da1c8 138 $podidx = "$Config{'archlib'}/pod.idx";
139 $podidx = "" unless -f $podidx && -r _ && -M _ <= 7;
140}
89b8affa 141
febd60db 142if ((my $opts = do{ local $^W; $opt_t + $opt_u + $opt_m + $opt_l }) > 1) {
137443ea 143 usage("only one of -t, -u, -m or -l")
febd60db 144}
d49321e7 145elsif ($Is_MSWin32
146 || $Is_Dos
147 || !(exists $ENV{TERM} && $ENV{TERM} !~ /dumb|emacs|none|unknown/i))
148{
c5ae3962 149 $opt_t = 1 unless $opts
137443ea 150}
4633a7c4 151
7eda7aea 152if ($opt_t) { require Pod::Text; import Pod::Text; }
4633a7c4 153
c5ae3962 154my @pages;
31bdbec1 155if ($opt_f) {
febd60db 156 @pages = ("perlfunc");
157}
158elsif ($opt_q) {
159 @pages = ("perlfaq1" .. "perlfaq9");
160}
161else {
162 @pages = @ARGV;
31bdbec1 163}
164
fb73857a 165# Does this look like a module or extension directory?
166if (-f "Makefile.PL") {
167 # Add ., lib and blib/* libs to @INC (if they exist)
168 unshift(@INC, '.');
169 unshift(@INC, 'lib') if -d 'lib';
170 require ExtUtils::testlib;
171}
172
4633a7c4 173sub containspod {
fb73857a 174 my($file, $readit) = @_;
175 return 1 if !$readit && $file =~ /\.pod$/i;
176 local($_);
177 open(TEST,"<$file");
febd60db 178 while (<TEST>) {
179 if (/^=head/) {
fb73857a 180 close(TEST);
181 return 1;
4633a7c4 182 }
fb73857a 183 }
184 close(TEST);
185 return 0;
4633a7c4 186}
187
84902520 188sub minus_f_nocase {
5315ba28 189 my($dir,$file) = @_;
190 my $path = join('/',$dir,$file);
191 return $path if -f $path and -r _;
192 if (!$opt_i or $Is_VMS or $Is_MSWin32 or $Is_Dos or $^O eq 'os2') {
febd60db 193 # on a case-forgiving file system or if case is important
5315ba28 194 # that is it all we can do
0cf744f2 195 warn "Ignored $path: unreadable\n" if -f _;
fb73857a 196 return '';
84902520 197 }
4633a7c4 198 local *DIR;
199 local($")="/";
5315ba28 200 my @p = ($dir);
201 my($p,$cip);
4633a7c4 202 foreach $p (split(/\//, $file)){
fb73857a 203 my $try = "@p/$p";
204 stat $try;
febd60db 205 if (-d _) {
4633a7c4 206 push @p, $p;
fb73857a 207 if ( $p eq $global_target) {
c5ae3962 208 my $tmp_path = join ('/', @p);
fb73857a 209 my $path_f = 0;
210 for (@global_found) {
211 $path_f = 1 if $_ eq $tmp_path;
212 }
213 push (@global_found, $tmp_path) unless $path_f;
214 print STDERR "Found as @p but directory\n" if $opt_v;
215 }
febd60db 216 }
217 elsif (-f _ && -r _) {
fb73857a 218 return $try;
febd60db 219 }
220 elsif (-f _) {
fb73857a 221 warn "Ignored $try: unreadable\n";
febd60db 222 }
223 else {
4633a7c4 224 my $found=0;
225 my $lcp = lc $p;
226 opendir DIR, "@p";
227 while ($cip=readdir(DIR)) {
228 if (lc $cip eq $lcp){
229 $found++;
230 last;
231 }
232 }
233 closedir DIR;
234 return "" unless $found;
235 push @p, $cip;
fb73857a 236 return "@p" if -f "@p" and -r _;
0cf744f2 237 warn "Ignored @p: unreadable\n" if -f _;
4633a7c4 238 }
239 }
5315ba28 240 return "";
fb73857a 241}
eb459f90 242
fb73857a 243
244sub check_file {
5315ba28 245 my($dir,$file) = @_;
3046dd9f 246 if ($opt_m) {
5315ba28 247 return minus_f_nocase($dir,$file);
febd60db 248 }
249 else {
5315ba28 250 my $path = minus_f_nocase($dir,$file);
249edfdf 251 return $path if length $path and containspod($path);
3046dd9f 252 }
5315ba28 253 return "";
fb73857a 254}
255
256
257sub searchfor {
258 my($recurse,$s,@dirs) = @_;
259 $s =~ s!::!/!g;
260 $s = VMS::Filespec::unixify($s) if $Is_VMS;
261 return $s if -f $s && containspod($s);
262 printf STDERR "Looking for $s in @dirs\n" if $opt_v;
263 my $ret;
264 my $i;
265 my $dir;
266 $global_target = (split('/', $s))[-1];
267 for ($i=0; $i<@dirs; $i++) {
268 $dir = $dirs[$i];
269 ($dir = VMS::Filespec::unixpath($dir)) =~ s!/$!! if $Is_VMS;
5315ba28 270 if ( ( $ret = check_file $dir,"$s.pod")
271 or ( $ret = check_file $dir,"$s.pm")
272 or ( $ret = check_file $dir,$s)
fb73857a 273 or ( $Is_VMS and
5315ba28 274 $ret = check_file $dir,"$s.com")
febd60db 275 or ( $^O eq 'os2' and
5315ba28 276 $ret = check_file $dir,"$s.cmd")
0151c6ef 277 or ( ($Is_MSWin32 or $Is_Dos or $^O eq 'os2') and
5315ba28 278 $ret = check_file $dir,"$s.bat")
279 or ( $ret = check_file "$dir/pod","$s.pod")
280 or ( $ret = check_file "$dir/pod",$s)
fb73857a 281 ) {
282 return $ret;
283 }
eb459f90 284
fb73857a 285 if ($recurse) {
286 opendir(D,$dir);
287 my @newdirs = map "$dir/$_", grep {
288 not /^\.\.?$/ and
289 not /^auto$/ and # save time! don't search auto dirs
290 -d "$dir/$_"
291 } readdir D;
292 closedir(D);
293 next unless @newdirs;
294 @newdirs = map((s/.dir$//,$_)[1],@newdirs) if $Is_VMS;
295 print STDERR "Also looking in @newdirs\n" if $opt_v;
296 push(@dirs,@newdirs);
297 }
298 }
299 return ();
300}
4633a7c4 301
eb459f90 302sub filter_nroff {
303 my @data = split /\n{2,}/, shift;
304 shift @data while @data and $data[0] !~ /\S/; # Go to header
305 shift @data if @data and $data[0] =~ /Contributed\s+Perl/; # Skip header
306 pop @data if @data and $data[-1] =~ /^\w/; # Skip footer, like
307 # 28/Jan/99 perl 5.005, patch 53 1
308 join "\n\n", @data;
309}
310
febd60db 311sub printout {
312 my ($file, $tmp, $filter) = @_;
313 my $err;
314
315 if ($opt_t) {
316 open(TMP,">>$tmp")
317 or warn("Can't open $tmp: $!"), return;
318 Pod::Text::pod2text($file,*TMP);
319 close TMP;
320 }
321 elsif (not $opt_u) {
322 my $cmd = "pod2man --lax $file | nroff -man";
323 $cmd .= " | col -x" if $^O =~ /hpux/;
324 my $rslt = `$cmd`;
325 $rslt = filter_nroff($rslt) if $filter;
326 unless (($err = $?)) {
327 open(TMP,">>$tmp") or warn("Can't open $tmp: $!"), return;
328 print TMP $rslt;
329 close TMP;
330 }
331 }
332 if ($opt_u or $err or -z $tmp) {
333 open(OUT,">>$tmp") or warn("Can't open $tmp: $!"), return;
334 open(IN,"<$file") or warn("Can't open $file: $!"), return;
335 my $cut = 1;
336 while (<IN>) {
337 $cut = $1 eq 'cut' if /^=(\w+)/;
338 next if $cut;
339 print OUT;
340 }
341 close IN;
342 close OUT;
343 }
344}
345
346sub page {
347 my ($tmp, $no_tty, @pagers) = @_;
348 if ($no_tty) {
349 open(TMP,"<$tmp") or warn("Can't open $tmp: $!"), return;
350 print while <TMP>;
351 close TMP;
352 }
353 else {
354 foreach my $pager (@pagers) {
355 system("$pager $tmp") or last;
356 }
357 }
358}
359
360sub cleanup {
361 my @files = @_;
362 for (@files) {
363 1 while unlink($_); #Possibly pointless VMSism
364 }
365}
366
367sub safe_exit {
368 my ($val, @files) = @_;
369 cleanup(@files);
370 exit $val;
371}
372
373sub safe_die {
374 my ($msg, @files) = @_;
375 cleanup(@files);
376 die $msg;
377}
378
c5ae3962 379my @found;
4633a7c4 380foreach (@pages) {
febd60db 381 if ($podidx && open(PODIDX, $podidx)) {
382 my $searchfor = $_;
383 local($_);
384 $searchfor =~ s,::,/,g;
385 print STDERR "Searching for '$searchfor' in $podidx\n" if $opt_v;
386 while (<PODIDX>) {
387 chomp;
388 push(@found, $_) if m,/$searchfor(?:\.(?:pod|pm))?$,i;
cce34969 389 }
febd60db 390 close(PODIDX);
391 next;
392 }
393 print STDERR "Searching for $_\n" if $opt_v;
394 # We must look both in @INC for library modules and in PATH
395 # for executables, like h2xs or perldoc itself.
396 my @searchdirs = @INC;
397 if ($opt_F) {
398 next unless -r;
399 push @found, $_ if $opt_m or containspod($_);
400 next;
401 }
402 unless ($opt_m) {
403 if ($Is_VMS) {
404 my($i,$trn);
405 for ($i = 0; $trn = $ENV{'DCL$PATH;'.$i}; $i++) {
406 push(@searchdirs,$trn);
7eda7aea 407 }
febd60db 408 push(@searchdirs,'perl_root:[lib.pod]') # installed pods
409 }
410 else {
411 push(@searchdirs, grep(-d, split($Config{path_sep},
412 $ENV{'PATH'})));
85880f03 413 }
febd60db 414 }
415 my @files = searchfor(0,$_,@searchdirs);
416 if (@files) {
417 print STDERR "Found as @files\n" if $opt_v;
418 }
419 else {
420 # no match, try recursive search
421 @searchdirs = grep(!/^\.$/,@INC);
422 @files= searchfor(1,$_,@searchdirs) if $opt_r;
423 if (@files) {
424 print STDERR "Loosely found as @files\n" if $opt_v;
425 }
426 else {
427 print STDERR "No documentation found for \"$_\".\n";
428 if (@global_found) {
429 print STDERR "However, try\n";
430 for my $dir (@global_found) {
431 opendir(DIR, $dir) or die "$!";
432 while (my $file = readdir(DIR)) {
433 next if ($file =~ /^\./);
434 $file =~ s/\.(pm|pod)$//;
435 print STDERR "\tperldoc $_\::$file\n";
436 }
437 closedir DIR;
4633a7c4 438 }
febd60db 439 }
4633a7c4 440 }
febd60db 441 }
442 push(@found,@files);
4633a7c4 443}
444
febd60db 445if (!@found) {
446 exit ($Is_VMS ? 98962 : 1);
4633a7c4 447}
448
44a8e56a 449if ($opt_l) {
450 print join("\n", @found), "\n";
451 exit;
452}
453
877622ba 454my $lines = $ENV{LINES} || 24;
455
c5ae3962 456my $no_tty;
febd60db 457if (! -t STDOUT) { $no_tty = 1 }
458
459# until here we could simply exit or die
460# now we create temporary files that we have to clean up
461# namely $tmp, $buffer
4633a7c4 462
c5ae3962 463my $tmp;
febd60db 464my $buffer;
137443ea 465if ($Is_MSWin32) {
febd60db 466 $tmp = "$ENV{TEMP}\\perldoc1.$$";
467 $buffer = "$ENV{TEMP}\\perldoc1.b$$";
468 push @pagers, qw( more< less notepad );
469 unshift @pagers, $ENV{PAGER} if $ENV{PAGER};
470 for (@found) { s,/,\\,g }
471}
472elsif ($Is_VMS) {
473 $tmp = 'Sys$Scratch:perldoc.tmp1_'.$$;
474 $buffer = 'Sys$Scratch:perldoc.tmp1_b'.$$;
475 push @pagers, qw( most more less type/page );
476}
477elsif ($Is_Dos) {
478 $tmp = "$ENV{TEMP}/perldoc1.$$";
479 $buffer = "$ENV{TEMP}/perldoc1.b$$";
480 $tmp =~ tr!\\/!//!s;
481 $buffer =~ tr!\\/!//!s;
482 push @pagers, qw( less.exe more.com< );
483 unshift @pagers, $ENV{PAGER} if $ENV{PAGER};
484}
485else {
486 if ($^O eq 'os2') {
487 require POSIX;
488 $tmp = POSIX::tmpnam();
489 $buffer = POSIX::tmpnam();
490 unshift @pagers, 'less', 'cmd /c more <';
491 }
492 else {
493 $tmp = "/tmp/perldoc1.$$";
494 $buffer = "/tmp/perldoc1.b$$";
495 }
496 push @pagers, qw( more less pg view cat );
497 unshift @pagers, $ENV{PAGER} if $ENV{PAGER};
4633a7c4 498}
44a8e56a 499unshift @pagers, $ENV{PERLDOC_PAGER} if $ENV{PERLDOC_PAGER};
4633a7c4 500
febd60db 501# all exit calls from here on have to be safe_exit calls (see above)
502# and all die calls safe_die calls to guarantee removal of files and
503# dir as needed
504
7eda7aea 505if ($opt_m) {
febd60db 506 foreach my $pager (@pagers) {
507 system("$pager @found") or safe_exit(0, $tmp, $buffer);
508 }
509 if ($Is_VMS) { eval 'use vmsish qw(status exit); exit $?' }
510 # I don't get the line above. Please patch yourself as needed.
511 safe_exit(1, $tmp, $buffer);
eb459f90 512}
7eda7aea 513
eb459f90 514my @pod;
31bdbec1 515if ($opt_f) {
febd60db 516 my $perlfunc = shift @found;
517 open(PFUNC, $perlfunc)
518 or safe_die("Can't open $perlfunc: $!", $tmp, $buffer);
31bdbec1 519
febd60db 520 # Functions like -r, -e, etc. are listed under `-X'.
521 my $search_string = ($opt_f =~ /^-[rwxoRWXOeszfdlpSbctugkTBMAC]$/)
522 ? 'I<-X' : $opt_f ;
a3cb178b 523
febd60db 524 # Skip introduction
525 while (<PFUNC>) {
526 last if /^=head2 Alphabetical Listing of Perl Functions/;
527 }
7eda7aea 528
febd60db 529 # Look for our function
530 my $found = 0;
531 my $inlist = 0;
532 while (<PFUNC>) {
533 if (/^=item\s+\Q$search_string\E\b/o) {
534 $found = 1;
85880f03 535 }
febd60db 536 elsif (/^=item/) {
537 last if $found > 1 and not $inlist;
538 }
539 next unless $found;
540 if (/^=over/) {
541 ++$inlist;
542 }
543 elsif (/^=back/) {
544 --$inlist;
4633a7c4 545 }
febd60db 546 push @pod, $_;
547 ++$found if /^\w/; # found descriptive text
548 }
549 if (!@pod) {
550 die "No documentation for perl function `$opt_f' found\n";
551 }
4633a7c4 552}
553
febd60db 554if ($opt_q) {
555 local @ARGV = @found; # I'm lazy, sue me.
556 my $found = 0;
557 my %found_in;
558
559 while (<>) {
560 if (/^=head2\s+.*(?:$opt_q)/oi) {
561 $found = 1;
562 push @pod, "=head1 Found in $ARGV\n\n" unless $found_in{$ARGV}++;
4633a7c4 563 }
febd60db 564 elsif (/^=head2/) {
565 $found = 0;
566 }
567 next unless $found;
568 push @pod, $_;
569 }
570 if (!@pod) {
571 safe_die("No documentation for perl FAQ keyword `$opt_q' found\n",
572 $tmp, $buffer);
573 }
574}
575
576my $filter;
577
578if (@pod) {
579 open(TMP,">$buffer") or safe_die("Can't open '$buffer': $!", $tmp, $buffer);
580 print TMP "=over 8\n\n";
581 print TMP @pod;
582 print TMP "=back\n";
583 close TMP;
584 @found = $buffer;
585 $filter = 1;
4633a7c4 586}
587
febd60db 588foreach (@found) {
589 printout($_, $tmp, $filter);
eb459f90 590}
febd60db 591page($tmp, $no_tty, @pagers);
4633a7c4 592
febd60db 593safe_exit(0, $tmp, $buffer);
7eda7aea 594
595__END__
596
597=head1 NAME
598
599perldoc - Look up Perl documentation in pod format.
600
601=head1 SYNOPSIS
602
89b8affa 603B<perldoc> [B<-h>] [B<-v>] [B<-t>] [B<-u>] [B<-m>] [B<-l>] [B<-F>] [B<-X>] PageName|ModuleName|ProgramName
7eda7aea 604
31bdbec1 605B<perldoc> B<-f> BuiltinFunction
606
c8950503 607B<perldoc> B<-q> FAQ Keyword
608
7eda7aea 609=head1 DESCRIPTION
610
40fc7247 611I<perldoc> looks up a piece of documentation in .pod format that is embedded
612in the perl installation tree or in a perl script, and displays it via
613C<pod2man | nroff -man | $PAGER>. (In addition, if running under HP-UX,
614C<col -x> will be used.) This is primarily used for the documentation for
615the perl library modules.
7eda7aea 616
617Your system may also have man pages installed for those modules, in
618which case you can probably just use the man(1) command.
619
620=head1 OPTIONS
621
622=over 5
623
624=item B<-h> help
625
626Prints out a brief help message.
627
628=item B<-v> verbose
629
630Describes search for the item in detail.
631
632=item B<-t> text output
633
634Display docs using plain text converter, instead of nroff. This may be faster,
635but it won't look as nice.
636
637=item B<-u> unformatted
638
639Find docs only; skip reformatting by pod2*
640
641=item B<-m> module
642
643Display the entire module: both code and unformatted pod documentation.
644This may be useful if the docs don't explain a function in the detail
645you need, and you'd like to inspect the code directly; perldoc will find
646the file for you and simply hand it off for display.
647
44a8e56a 648=item B<-l> file name only
649
650Display the file name of the module found.
651
cce34969 652=item B<-F> file names
653
89b8affa 654Consider arguments as file names, no search in directories will be performed.
cce34969 655
31bdbec1 656=item B<-f> perlfunc
657
658The B<-f> option followed by the name of a perl built in function will
659extract the documentation of this function from L<perlfunc>.
660
c8950503 661=item B<-q> perlfaq
662
663The B<-q> option takes a regular expression as an argument. It will search
664the question headings in perlfaq[1-9] and print the entries matching
665the regular expression.
666
89b8affa 667=item B<-X> use an index if present
668
669The B<-X> option looks for a entry whose basename matches the name given on the
670command line in the file C<$Config{archlib}/pod.idx>. The pod.idx file should
671contain fully qualified filenames, one per line.
672
7eda7aea 673=item B<PageName|ModuleName|ProgramName>
674
675The item you want to look up. Nested modules (such as C<File::Basename>)
676are specified either as C<File::Basename> or C<File/Basename>. You may also
1b420867 677give a descriptive name of a page, such as C<perlfunc>. You may also give a
7eda7aea 678partial or wrong-case name, such as "basename" for "File::Basename", but
679this will be slower, if there is more then one page with the same partial
680name, you will only get the first one.
681
682=back
683
684=head1 ENVIRONMENT
685
febd60db 686Any switches in the C<PERLDOC> environment variable will be used before the
7eda7aea 687command line arguments. C<perldoc> also searches directories
688specified by the C<PERL5LIB> (or C<PERLLIB> if C<PERL5LIB> is not
689defined) and C<PATH> environment variables.
690(The latter is so that embedded pods for executables, such as
a3cb178b 691C<perldoc> itself, are available.) C<perldoc> will use, in order of
692preference, the pager defined in C<PERLDOC_PAGER>, C<MANPAGER>, or
693C<PAGER> before trying to find a pager on its own. (C<MANPAGER> is not
694used if C<perldoc> was told to display plain text or unformatted pod.)
7eda7aea 695
eb459f90 696One useful value for C<PERLDOC_PAGER> is C<less -+C -E>.
697
febd60db 698=head1 VERSION
699
700This is perldoc v2.0.
701
7eda7aea 702=head1 AUTHOR
703
704Kenneth Albanowski <kjahds@kjahds.com>
705
febd60db 706Minor updates by Andy Dougherty <doughera@lafcol.lafayette.edu>,
707and others.
7eda7aea 708
7eda7aea 709=cut
710
711#
c5ae3962 712# Version 1.14: Wed Jul 15 01:50:20 EST 1998
713# Robin Barker <rmb1@cise.npl.co.uk>
714# -strict, -w cleanups
89b8affa 715# Version 1.13: Fri Feb 27 16:20:50 EST 1997
716# Gurusamy Sarathy <gsar@umich.edu>
717# -doc tweaks for -F and -X options
137443ea 718# Version 1.12: Sat Apr 12 22:41:09 EST 1997
719# Gurusamy Sarathy <gsar@umich.edu>
720# -various fixes for win32
7eda7aea 721# Version 1.11: Tue Dec 26 09:54:33 EST 1995
722# Kenneth Albanowski <kjahds@kjahds.com>
723# -added Charles Bailey's further VMS patches, and -u switch
724# -added -t switch, with pod2text support
febd60db 725#
7eda7aea 726# Version 1.10: Thu Nov 9 07:23:47 EST 1995
727# Kenneth Albanowski <kjahds@kjahds.com>
728# -added VMS support
729# -added better error recognition (on no found pages, just exit. On
730# missing nroff/pod2man, just display raw pod.)
731# -added recursive/case-insensitive matching (thanks, Andreas). This
732# slows things down a bit, unfortunately. Give a precise name, and
733# it'll run faster.
734#
735# Version 1.01: Tue May 30 14:47:34 EDT 1995
736# Andy Dougherty <doughera@lafcol.lafayette.edu>
737# -added pod documentation.
738# -added PATH searching.
739# -added searching pod/ subdirectory (mainly to pick up perlfunc.pod
740# and friends.
741#
742#
743# TODO:
744#
745# Cache directories read during sloppy match
4633a7c4 746!NO!SUBS!
747
748close OUT or die "Can't close $file: $!";
749chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
750exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
8a5546a1 751chdir $origdir;