Bill Jones wrote: > On 1/15/07, Michael Alipio <[EMAIL PROTECTED]> wrote: >> >> Is there a way to list down all builtin functions so that I may know >> what to "perldoc -f"? > > Here is an example (from Apache2Triad on Windows.)
This doesn't list "all builtin functions", it lists all environment variables and modules. > #!C:/apache2triad/perl/bin/perl.exe You should include these two pragmas at the start of your program: use warnings; use strict; > print "Content-type: text/html\n\n"; > > # > # general info > # > > print <<HTML; > <html><link rel=stylesheet href=style.css> > <h2 align=center>general info</h2> > <p> > <table class=table border=0 cellpadding=4 cellspacing=1 width=100%> > <tr> > <td width=35% class=tdd><b>perl version:</b></td> > <td width=65% class=tdl>$]</td> > </tr> > <tr> > <td class=tdd><b>perl compiled on:</b></td> > <td class=tdl>$^O</td> > </tr> > <tr> > <td class=tdd><b>perl executable:</b></td> > <td class=tdl>$^X</td> > </tr> > <tr> > <td class=tdd><b>location of perl:</b></td> > <td class=tdl> > HTML > > $per = $^X ; > $per =~ s/perl.exe|PERL.EXE//; > @perlloc = ("$per"); perldoc -q quoting Found in /usr/lib/perl5/5.8.6/pod/perlfaq4.pod What’s wrong with always quoting "$vars"? Also the precedence is unambiguous so the parentheses are not required. > foreach $loc(@perlloc){ > print "$loc<br>\n"; > } You just assigned a single value to the array and are using a loop to print it out??? Why not just: print "$per<br>\n"; > print <<HTML; > </td></tr><tr><td class=tdd> <b>include paths:</b></td><td class=tdl> > HTML > > foreach $item(@INC){ > if ($item ne "."){ > print "$item <br>\n"; > } > } > > print <<HTML; > </td></tr></table> > HTML > > # > # environment variables > # > > print <<HTML; > <h2 align=center>environment variables</h2><table class=table > border=0 cellpadding=4 cellspacing=1 width=100%> > <tr><td class=tdark ><b>Server Variable</b></td><td class=tdg >> <b>Value</b></td></tr> > HTML > > foreach $fieldname(keys %ENV){ > print "<tr><td width=35% class=tdd><font > size=-1>$fieldname<font></td>\n"; > print "<td width=65% class=tdl><font > size=-1>$ENV{$fieldname} <font></td></tr>\n"; > } > > print <<HTML; > </table> > HTML > > # > # perl modules > # > > use File::Find; > > sub count { You call this subroutine *count* but it has nothing to do with *counting* or with a *count* value? > return $found{$a}[1] cmp $found{$b}[1]; > } > > sub ModuleScanner { > if ($File::Find::name =~ /\.pm$/){ > open(FILE,$File::Find::name) || return; File::Find::find() puts the current file name into $_ so there is no need to use $File::Find::name: if ( /\.pm$/ ) { open FILE, '<', $_ or return; > while(<FILE>){ > if (/^ *package +(\S+);/){ > push (@modules, $1); > last; > } > } > } > } > > find(\&ModuleScanner,@INC); > foreach $line(@modules){ > $match = lc($line); > if ($found{$line}[0] >0){ > $found{$line} = [$found{$line}[0]+1,$match] > }else{ > $found{$line} = ["1",$match]; > } > } Because of autovivification you could simplify that to: foreach my $line ( @modules ) { $found{ $line }[ 0 ]++; $found{ $line }[ 1 ] = lc $line; } But you never use $found{ $line }[ 0 ] anywhere else so why is it there? > @modules = sort count keys(%found); You are sorting based on the lower case values of the keys so why not call your sub 'ignore_case' instead of 'count'? > print <<HTML; > <h2 align=center>perl modules</h2><table class=table border=0 > cellpadding=4 cellspacing=1 width=100%> > HTML > > $count=0; > foreach $mod(@modules){ > chomp $mod; Why are you chomp()ing $mod? You used the regular expression /^ *package +(\S+);/ to get the module names and the character class \S cannot contain any carriage returns or newlines. > $count++; > if ($count == 1){ > print "<tr><td class=tdl>$mod</td>\n"; > } > if ($count == 2){ > print "<td class=tdl>$mod</td>\n"; > } > if ($count == 3){ > print "<td class=tdl>$mod</td></tr>\n"; > $count = 0; > } > } You have three tests in that loop. That means that for every three loops you are performing nine tests. If $count is equal to 1 why bother to also compare it to 2 and 3 and if $count is equal to 2 why bother to also compare it to 3? If you change 'if' to 'elsif' in the second and third tests you will reduce the number of tests by 33% (from nine to six for every three loops.) my $count = 0; foreach my $mod ( @modules ) { $count++; if ( $count == 1 ) { print "<tr><td class=tdl>$mod</td>\n"; } elsif ( $count == 2 ) { print "<td class=tdl>$mod</td>\n"; } elsif ( $count == 3 ) { print "<td class=tdl>$mod</td></tr>\n"; $count = 0; } } However you can remove the "magic numbers" and make the code more flexible: my @formats = ( "<tr><td class=tdl>%s</td>\n", "<td class=tdl>%s</td>\n", "<td class=tdl>%s</td></tr>\n", ); for my $index ( 0 .. $#modules ) { printf $formats[ $index % @formats ], $modules[ $index ]; } > print <<HTML; > </table></html> > HTML > > exit; If you are going to use exit() you should at least return something useful to the OS: exit 0; John -- Perl isn't a toolbox, but a small machine shop where you can special-order certain sorts of tools at low cost and in short order. -- Larry Wall -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/