Provided by: manpages-zh_1.5.2-1_all bug


       perlfaq3 -  (2003/11/24 19:55:50)



        CPAN perlfaq2? (man pages)?:

               Basics          perldata, perlvar, perlsyn, perlop, perlsub
               Execution       perlrun, perldebug
               Functions       perlfunc
               Objects         perlref, perlmod, perlobj, perltie
               Data Structures perlref, perllol, perldsc
               Modules         perlmod, perlmodlib, perlsub
               Regexes         perlre, perlfunc, perlop, perllocale
               Moving to perl5 perltrap, perl
               Linking w/C     perlxstut, perlxs, perlcall, perlguts, perlembed
                                 Perl )

       perltoc perl


        perldebug(1) Perl

           perl -de 42

        Perl (symbol table) (stack backtraces) (set breakpoints)  (symbolic

        Perl shell?

       The psh (Perl sh) is currently at version 1.8. The Perl Shell is a
       shell that combines the interactive nature of a Unix shell with the
       power of Perl. The goal is a full featured shell that behaves as
       expected for normal shell activity and uses Perl syntax and
       functionality for control-flow statements and other things.  You can
       get psh at .

       Zoidberg is a similar project and provides a shell written in perl,
       configured in perl and operated in perl. It is intended as a login
       shell and development environment. It can be found at or your local CPAN mirror.

       The module (distributed with Perl) makes Perl try commands
       which aren't part of the Perl language as shell commands.  perlsh from
       the source distribution is simplistic and uninteresting, but may still
       be what you want.

       You can use the ExtUtils::Installed module to show all installed
       distributions, although it can take awhile to do its magic.  The
       standard library which comes with Perl just shows up as "Perl"
       (although you can get those with Module::CoreList).

               use ExtUtils::Installed;

               my $inst    = ExtUtils::Installed->new();
               my @modules = $inst->modules();

       If you want a list of all of the Perl module filenames, you can use

               use File::Find::Rule;

               my @files = File::Find::Rule->file()->name( '*.pm' )->in( @INC );

       If you do not have that module, you can do the same thing with
       File::Find which is part of the standard library.

           use File::Find;
           my @files;

           find sub { push @files, $File::Find::name if -f _ && /\.pm$/ },

               print join "\n", @files;

       If you simply need to quickly check to see if a module is available,
       you can check for its documentation.  If you can read the documentation
       the module is most likely installed.  If you cannot read the
       documentation, the module might not have any (in rare cases).

               prompt% perldoc Module::Name

       You can also try to include the module in a one-liner to see if perl
       finds it.

               perl -MModule::Name -e1

        Perl ?

        "use warnings"  "-w"

        "use strict" It prevents you from using symbolic references, makes you
       predeclare any subroutines that you call as bare words, and (probably
       most importantly) forces you to predeclare your variables with "my",
       "our", or "use vars".

       Did you check the return values of each and every system call?  The
       operating system (and thus Perl) tells you whether they worked, and if
       not why.

         open(FH, "> /etc/cantwrite")
           or die "Couldn't write to /etc/cantwrite: $!\n";

       Did you read perltrap?  It's full of gotchas for old and new Perl
       programmers and even has sections for those of you who are upgrading
       from languages like awk and C.

       Have you tried the Perl debugger, described in perldebug?  You can step
       through your program and see what it's doing and thus work out why what
       it's doing isn't what it should be doing.

        (profile)  perl ?

        CPAN Devel::DProf  perl Devel::DProf

       Here's a sample use of Benchmark:

         use Benchmark;

         @junk = `cat /etc/motd`;
         $count = 10_000;

         timethese($count, {
                   'map' => sub { my @a = @junk;
                                  map { s/a/b/ } @a;
                                  return @a },
                   'for' => sub { my @a = @junk;
                                  for (@a) { s/a/b/ };
                                  return @a },

       This is what it prints (on one machine--your results will be dependent
       on your hardware, operating system, and the load on your machine):

         Benchmark: timing 10000 iterations of for, map...
                for:  4 secs ( 3.97 usr  0.01 sys =  3.98 cpu)
                map:  6 secs ( 4.97 usr  0.00 sys =  4.97 cpu)

       Be aware that a good benchmark is very hard to write.  It only tests
       the data you give it and proves little about the differing complexities
       of contrasting algorithms.


       B::Xref  Perl cross-reference

           perl -MO=Xref[,OPTIONS] scriptname.plx


       Perltidy is a Perl script which indents and reformats Perl scripts to
       make them easier to read by trying to follow the rules of the
       perlstyle. If you write Perl scripts, or spend much time reading them,
       you will probably find it useful.  It is available at

       Of course, if you simply follow the guidelines in perlstyle, you
       shouldn't need to reformat.  The habit of formatting your code as you
       write it will help prevent bugs.  Your editor can and should help you
       with this.  The perl-mode or newer cperl-mode for emacs can provide
       remarkable amounts of help with most (but not all) code, and even less
       programmable editors can provide significant assistance.  Tom
       Christiansen and many other VI users  swear by the following settings
       in vi and its clones:

           set ai sw=4
           map! ^O {^M}^[O^T

       Put that in your .exrc file (replacing the caret characters with
       control characters) and away you go.  In insert mode, ^T is for
       indenting, ^D is for undenting, and ^O is for blockdenting-- as it
       were.  A more complete example, with comments, can be found at

       The a2ps does
       lots of things related to generating nicely printed output of
       documents, as does enscript at .

        Perl ctags ?

       Recent versions of ctags do much more than older versions did.
       EXUBERANT CTAGS is available from and
       does a good job of making tags files for perl code.

       There is also a simple one at which may do the
       trick.  It can be easy to hack this into what you want.

       Is there an IDE or Windows Perl Editor?

       Perl programs are just plain text, so any editor will do.

       If you're on Unix, you already have an IDE--Unix itself.  The UNIX
       philosophy is the philosophy of several small tools that each do one
       thing and do it well.  It's like a carpenter's toolbox.

       If you want an IDE, check the following:

           ActiveState's cross-platform (as of April 2001 Windows and Linux),
           multi-language IDE has Perl support, including a regular expression
           debugger and remote debugging (
  ).  (Visual
           Perl, a Visual Studio.NET plug-in is currently (early 2001) in beta
           ( )).

       The Object System
           ( ) is a Perl web
           applications development IDE, apparently for any platform that runs

       Open Perl IDE
           ( ) Open Perl IDE is an
           integrated development environment for writing and debugging Perl
           scripts with ActiveState's ActivePerl distribution under Windows

           ( ) is an integrated
           development environment for Windows that supports Perl development.

           ( ) From Help Consulting, for

           ( ) is a Windows IDE with simulated CGI
           environment, including debugger and syntax highlighting editor.

       For editors: if you're on Unix you probably have vi or a vi clone
       already, and possibly an emacs too, so you may not need to download
       anything.  In any emacs the cperl-mode (M-x cperl-mode) gives you
       perhaps the best available Perl editing mode in any editor.

       If you are using Windows, you can use any editor that lets you work
       with plain text, such as NotePad or WordPad.  Word processors, such as
       Microsoft Word or WordPerfect, typically do not work since they insert
       all sorts of behind-the-scenes information, although some allow you to
       save files as "Text Only". You can also download text editors designed
       specifically for programming, such as Textpad (
       ) and UltraEdit ( ), among others.

       If you are using MacOS, the same concerns apply.  MacPerl (for Classic
       environments) comes with a simple editor.  Popular external editors are
       BBEdit ( ) or Alpha ( ). MacOS X users can use Unix editors as

       GNU Emacs




       or a vi clone such as




       For vi lovers in general, Windows or elsewhere:


       nvi ( , available from CPAN in src/misc/) is
       yet another vi clone, unfortunately not available for Windows, but in
       UNIX platforms you might be interested in trying it out, firstly
       because strictly speaking it is not a vi clone, it is the real vi, or
       the new incarnation of it, and secondly because you can embed Perl
       inside it to use Perl as the scripting language.  nvi is not alone in
       this, though: at least also vim and vile offer an embedded Perl.

       The following are Win32 multilanguage editor/IDESs that support Perl:




       There is also a toyedit Text widget based editor written in Perl that
       is distributed with the Tk module on CPAN.  The ptkdb ( ) is a Perl/tk based debugger that
       acts as a development environment of sorts.  Perl Composer ( ) is an IDE for Perl/Tk GUI

       In addition to an editor/IDE you might be interested in a more powerful
       shell environment for Win32.  Your options include

           from the Cygwin package ( )

       Ksh from the MKS Toolkit ( ), or the Bourne shell
           of the U/WIN environment (

  , see also

       Zsh , see also

       MKS and U/WIN are commercial (U/WIN is free for educational and
       research purposes), Cygwin is covered by the GNU Public License (but
       that shouldn't matter for Perl use).  The Cygwin, MKS, and U/WIN all
       contain (in addition to the shells) a comprehensive set of standard
       UNIX toolkit utilities.

       If you're transferring text files between Unix and Windows using FTP be
       sure to transfer them in ASCII mode so the ends of lines are
       appropriately converted.

       On Mac OS the MacPerl Application comes with a simple 32k text editor
       that behaves like a rudimentary IDE.  In contrast to the MacPerl
       Application the MPW Perl tool can make use of the MPW Shell itself as
       an editor (with no 32k limit).

       BBEdit and BBEdit Lite
           are text editors for Mac OS that have a Perl sensitivity mode (

           is an editor, written and extensible in Tcl, that nonetheless has
           built in support for several popular markup and programming
           languages including Perl and HTML ( ).

       Pepper and Pe are programming language sensitive text editors for Mac
       OS X and BeOS respectively ( ).

        vi  Perl

       For a complete version of Tom Christiansen's vi configuration file, see , the
       standard benchmark file for vi emulators.  The file runs best with nvi,
       the current version of vi out of Berkeley, which incidentally can be
       built with an embedded Perl interpreter--see .

        emacs perl?

        Emacs 19.22 (version 19 patchlevel 22) perl-mode.el perl  Emacs 19

        perl ``emacs''  cperl-mode

       ``main'foo'' emacs perl-mode   (indentation)  (hilighting)
       ``main::foo''  main'foo  package [perl5] main::foo

        Perl curses?

       The Curses module from CPAN provides a dynamically loadable object
       module interface to a curses library.  A small demo can be found at the
       directory ;
       this program repeats a command and updates the screen as needed,
       rendering rep ps axu similar to top.

       X Tk Perl?

       Tk  Perl  Tcl TkSx Athena Widget set CPAN

       Invaluable for Perl/Tk programming are the Perl/Tk FAQ at , the Perl/Tk
       Reference Guide available at , and the online manpages
       at .

        CGI Tk ?  curses


        (algorithm)Jon Bentley's book Programming Pearls (!)  Advice on
       benchmarking boils down to: benchmark and profile to make sure you're
       optimizing the right part, look for better algorithms instead of
       microtuning your code, and when all else fails consider just buying
       faster hardware.  You will probably want to read the answer to the
       earlier question ``How do I profile my Perl programs?'' if you haven't
       done so already.

        Perl  perl  AutoSplit AutoLoader C C C  ( CPAN PDL )

        perl libc.a perl 10-25% perl Perl ()  perl INSTALL



        Perl  Perl (Scalar)  C  (Hashes) 5.004   (duplicate hash keys)

        substr() vec()  20,000 125 (bit vector) Tie::SubstrHash () C Perl

        Perl malloc  Perl malloc  malloc perl INSTALL  "perl -V:usemymalloc".
       perl malloc

       Of course, the best way to save memory is to not do anything to waste
       it in the first place. Good programming practices can go a long way
       toward this:

       * Don't slurp!
           Don't read an entire file into memory if you can process it line by
           line. Or more concretely, use a loop like this:

                   # Good Idea
                   while (<FILE>) {
                      # ...

           instead of this:

                   # Bad Idea
                   @data = <FILE>;
                   foreach (@data) {
                       # ...

           When the files you're processing are small, it doesn't much matter
           which way you do it, but it makes a huge difference when they start
           getting larger.

       * Use map and grep selectively
           Remember that both map and grep expect a LIST argument, so doing

                   @wanted = grep {/pattern/} <FILE>;

           will cause the entire file to be slurped. For large files, it's
           better to loop:

                   while (<FILE>) {
                           push(@wanted, $_) if /pattern/;

       * Avoid unnecessary quotes and stringification
           Don't quote large strings unless absolutely necessary:

                   my $copy = "$large_string";

           makes 2 copies of $large_string (one for $copy and another for the
           quotes), whereas

                   my $copy = $large_string;

           only makes one copy.

           Ditto for stringifying large arrays:

                           local $, = "\n";
                           print @big_array;

           is much more memory-efficient than either

                   print join "\n", @big_array;


                           local $" = "\n";
                           print "@big_array";

       * Pass by reference
           Pass arrays and hashes by reference, not by value. For one thing,
           it's the only way to pass multiple lists or hashes (or both) in a
           single call/return. It also avoids creating a copy of all the
           contents. This requires some judgment, however, because any changes
           will be propagated back to the original data. If you really want to
           mangle (er, modify) a copy, you'll have to sacrifice the memory
           needed to make one.

       * Tie large variables to disk.
           For "big" data stores (i.e. ones that exceed available memory)
           consider using one of the DB modules to store it on disk instead of
           in RAM. This will incur a penalty in access time, but that's
           probably better than causing your hard disk to thrash due to
           massive swapping.


       Perl (garbage collection)

           sub makeone {
               my @a = ( 1 .. 10 );
               return \@a;

           for ( 1 .. 10 ) {
               push @many, makeone();

           print $many[4][5], "\n";

           print "@many\n";


        (re-exec) Some operating systems (notably, systems that use mmap(2)
       for allocating large chunks of memory) can reclaim memory that is no
       longer used, but on such systems, perl must be configured and compiled
       to use the OS's malloc, not perl's.

        my() Perl  (my() 10%) undef()  delete() Perl

        CGI (script)?

        Perl CGI  1 MB C   (start-up overhead)

        mod_perl  mod_fastcgi Apache HTTP server

        mod_perl  Apache::* ( CPAN)httpd  PerlApache  Perl server API  Perl C

        FCGI ( CPAN)  mod_fastcgi ( Perl  CGI


       A non-free, commercial product, ``The Velocity Engine for Perl'',
       ( or )
       might also be worth looking at.  It will allow you to increase the
       performance of your Perl programs, running programs up to 25 times
       faster than normal CGI Perl when running in persistent Perl mode or 4
       to 5 times faster without any modification to your existing CGI
       programs. Fully functional evaluation copies are available from the web


        :-) ""()

        ? ( CGI) 0755

        (CPAN Filter::*) byte code  (native-code compiler)( Perl)

        Perl  perl  B:: B::Deparse  Perl

       " XYZ..."

        Perl byte code C?

       Malcolm Beattie CPAN perl5.005

        C  Perl  10-30% ()

        Perl eval()  perl INSTALL pod perl  /usr/bin/perl 11k""!

       In general, the compiler will do nothing to make a Perl program
       smaller, faster, more portable, or more secure.  In fact, it can make
       your situation worse.  The executable will be bigger, your VM system
       may take longer to load the whole thing, the binary is fragile and hard
       to fix, and compilation never stopped software piracy in the form of
       crackers, viruses, or bootleggers.  The real advantage of the compiler
       is merely packaging, and once you see the size of what it makes (well,
       unless you use a shared, you'll probably want a complete
       Perl install anyway.

       How can I compile Perl into Java?

       You can also integrate Java and Perl with the Perl Resource Kit from
       O'Reilly and Associates.  See .

       Perl 5.6 comes with Java Perl Lingo, or JPL.  JPL, still in
       development, allows Perl code to be called from Java.  See jpl/README
       in the Perl source tree.


           extproc perl -S -your_switches

        "*.cmd"  ("-S"  cmd.exe `extproc')DOS batch  ALTERNATIVE_SHEBANG (

       The Win95/NT installation, when using the ActiveState port of Perl,
       will modify the Registry to associate the ".pl" extension with the perl
       interpreter.  If you install another port, perhaps even building your
       own Win95/NT Perl from the standard sources by using a Windows port of
       gcc (e.g., with cygwin or mingw32), then you'll have to modify the
       Registry yourself.  In addition to associating ".pl" with the
       interpreter, NT people can use: "SET PATHEXT=%PATHEXT%;.PL" to let them
       run the program "" merely by typing "install-linux".

        perl (Creator and Type) perl

       : perl  cgi-bin web


        perlrun ( Unix shell)

           perl -lane 'print $F[0] + $F[-1]' *

           perl -le 'for(@ARGV) {print if -f && -T _}' *

           #  C
           perl -0777 -pe 's{/\*.*?\*/}{}gs' foo.c

           #  reaper daemons
           perl -e '$X=24*60*60; utime(time(),time() + 30 * $X,@ARGV)' *

           #  uid
           perl -le '$i++ while getpwuid($i); print $i'

           #  (manpath)
           echo $PATH | perl -nl -072 -e '

       perl (Obfuscated Perl)  :-)

        perl  DOS/Mac/VMS?

        Unix shells  perl   Unix Plan9 % %%

           # Unix
           perl -e 'print "Hello world\n"'

           # DOS
           perl -e "print \"Hello world\n\""

           # Mac
           print "Hello world\n"
            ( "Myscript"  Shift-Command-R)

           # MPW
           perl -e 'print "Hello world\n"'

           # VMS
           perl -e "print ""Hello world\n"""

        Unix DOS 4DOS

         perl -e "print <Ctrl-x>"Hello world\n<Ctrl-x>""

        Mac  MacPerl shell MPW  Unix shells Mac  ASCII

       Using qq(), q(), and qx(), instead of "double quotes", 'single quotes',
       and `backticks`, may make one-liners easier to write.

       [ Kenneth Albanowski ]

        Perl CGI Web?

        CPAN CGI  LWP  web  web" 500"""



       perltoot perlobj  perlbootPerltootperltooc  perlbot ( Perl  perl)

        Perl  OO  "Object-Oriented Perl"  Damian Conway  Manning Publications,

        Perl  C [h2xs, xsubpp]

        Perl C perlxstut perlxs xsubpp  perlguts perlembed perlcall  perlguts

        perlembed,perlguts  C  perl

        CPAN  ExtUtils::Embed  `make test' pod  perlbug "make test
       TEST_VERBOSE=1"  "perl -V"

       perldiag perl splain ( perl)

           perl program 2>diag.out
           splain [-v] [-p] diag.out

           use diagnostics;

           use diagnostics -verbose;

        What's MakeMaker?

        ( perl ) Makefile.PL  Makefile ExtUtils::MakeMaker


       Copyright (c) 1997-2002 Tom Christiansen and Nathan Torkington.  All
       rights reserved.

       This documentation is free; you can redistribute it and/or modify it
       under the same terms as Perl itself.

       Irrespective of its distribution, all code examples here are in the
       public domain.  You are permitted and encouraged to use this code and
       any derivatives thereof in your own programs for fun or for profit as
       you see fit.  A simple comment in the code giving credit to the FAQ
       would be courteous but is not required.