PERLFAQ3(7) Perl Programmers Reference Guide PERLFAQ3(7) NAME perlfaq3 - (2003/11/24 19:55:50) DESCRIPTION ()? 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 Various http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz ( Perl ) perltoc perl Perl? perldebug(1) Perl perl -de 42 Perl (symbol table) (stack backtraces) (set breakpoints) (symbolic debuggers) 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 http://www.focusresearch.com/gregor/psh/ . 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 http://zoidberg.sf.net/ or your local CPAN mirror. The Shell.pm 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 File::Find::Rule. 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$/ }, @INC; 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 Benchmark.pm Benchmark.pm 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. Perl B::Xref Perl cross- reference perl -MO=Xref[,OPTIONS] scriptname.plx Perl? 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 http://perltidy.sourceforge.net 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 http://www.cpan.org/authors/id/TOMC/scripts/toms.exrc.gz The a2ps http://www-inf.enst.fr/%7Edemaille/a2ps/black+white.ps.gz does lots of things related to generating nicely printed output of documents, as does enscript at http://people.ssh.fi/mtr/genscript/ . Perl ctags ? Recent versions of ctags do much more than older versions did. EXUBERANT CTAGS is available from http://ctags.sourceforge.net/ and does a good job of making tags files for perl code. There is also a simple one at http://www.cpan.org/authors/id/TOMC/scripts/ptags.gz 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: Komodo 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 ( http://www.ActiveState.com/Products/Komodo/index.html ). (Visual Perl, a Visual Studio.NET plug-in is currently (early 2001) in beta ( http://www.ActiveState.com/Products/VisualPerl/index.html )). The Object System ( http://www.castlelink.co.uk/object_system/ ) is a Perl web applications development IDE, apparently for any platform that runs Perl. Open Perl IDE ( http://open-perl-ide.sourceforge.net/ ) Open Perl IDE is an integrated development environment for writing and debugging Perl scripts with ActiveState's ActivePerl distribution under Windows 95/98/NT/2000. PerlBuilder ( http://www.solutionsoft.com/perl.htm ) is an integrated development environment for Windows that supports Perl development. visiPerl+ ( http://helpconsulting.net/visiperl/ ) From Help Consulting, for Windows. OptiPerl ( http://www.optiperl.com/ ) 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 ( http://www.textpad.com/ ) and UltraEdit ( http://www.ultraedit.com/ ), 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 ( http://www.bbedit.com/ ) or Alpha ( http://www.kelehers.org/alpha/ ). MacOS X users can use Unix editors as well. GNU Emacs http://www.gnu.org/software/emacs/windows/ntemacs.html MicroEMACS http://www.microemacs.de/ XEmacs http://www.xemacs.org/Download/index.html Jed http://space.mit.edu/~davis/jed/ or a vi clone such as Elvis ftp://ftp.cs.pdx.edu/pub/elvis/ http://www.fh-wedel.de/elvis/ Vile http://dickey.his.com/vile/vile.html Vim http://www.vim.org/ For vi lovers in general, Windows or elsewhere: http://www.thomer.com/thomer/vi/vi.html nvi ( http://www.bostic.com/vi/ , 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: Codewright http://www.starbase.com/ MultiEdit http://www.MultiEdit.com/ SlickEdit http://www.slickedit.com/ There is also a toyedit Text widget based editor written in Perl that is distributed with the Tk module on CPAN. The ptkdb ( http://world.std.com/~aep/ptkdb/ ) is a Perl/tk based debugger that acts as a development environment of sorts. Perl Composer ( http://perlcomposer.sourceforge.net/ ) is an IDE for Perl/Tk GUI creation. In addition to an editor/IDE you might be interested in a more powerful shell environment for Win32. Your options include Bash from the Cygwin package ( http://sources.redhat.com/cygwin/ ) Ksh from the MKS Toolkit ( http://www.mks.com/ ), or the Bourne shell of the U/WIN environment ( http://www.research.att.com/sw/tools/uwin/ ) Tcsh ftp://ftp.astron.com/pub/tcsh/ , see also http://www.primate.wisc.edu/software/csh-tcsh-book/ Zsh ftp://ftp.blarg.net/users/amol/zsh/ , see also http://www.zsh.org/ 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 ( http://web.barebones.com/ ). Alpha 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 ( http://alpha.olm.net/ ). Pepper and Pe are programming language sensitive text editors for Mac OS X and BeOS respectively ( http://www.hekkelman.com/ ). vi Perl For a complete version of Tom Christiansen's vi configuration file, see http://www.cpan.org/authors/Tom_Christiansen/scripts/toms.exrc.gz , 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 http://www.cpan.org/src/misc/ . 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 http://www.cpan.org/authors/Tom_Christiansen/scripts/rep.gz ; 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 http://www.cpan.org/modules/by-category/08_User_Interfaces/ Invaluable for Perl/Tk programming are the Perl/Tk FAQ at http://w4.lns.cornell.edu/%7Epvhp/ptk/ptkTOC.html , the Perl/Tk Reference Guide available at http://www.cpan.org/authors/Stephen_O_Lidie/ , and the online manpages at http://www-users.cs.umn.edu/%7Eamundson/perl/perltk/toc.html . CGI Tk ? http://www.cpan.org/authors/id/SKUNZ/perlmenu.v4.0.tar.gz curses Perl? (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.so libc.a perl 10-25% perl Perl () perl INSTALL undump Perl 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 () { # ... } instead of this: # # Bad Idea # @data = ; 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 this: @wanted = grep {/pattern/} ; will cause the entire file to be slurped. For large files, it's better to loop: while () { 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; or { 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 http://perl.apache.org/ FCGI ( CPAN) mod_fastcgi ( http://www.fastcgi.com/) Perl CGI CGI http://www.cpan.org/modules/by-category/15_World_Wide_Web_HTML_HTTP_CGI/ . A non-free, commercial product, ``The Velocity Engine for Perl'', (http://www.binevolve.com/ or http://www.binevolve.com/velocigen/ ) 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 site. Perl? :-) ""() ? ( 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() libperl.so 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 libperl.so), 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 http://www.oreilly.com/catalog/prkunix/ . 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. OS/2 extproc perl -S -your_switches "*.cmd" ("-S" cmd.exe `extproc')DOS batch ALTERNATIVE_SHEBANG ( INSTALL) 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 "install-linux.pl" 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 ' s![^/+]*$!man!&&-d&&!$s{$_}++&&push@m,$_;END{print"@m"}' 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 "Hello world\n"" 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""" http://www.perl.org/CGI_MetaFAQ.html Perl perltoot perlobj perlbootPerltootperltooc perlbot ( Perl http://www.perldoc.com/ perl) Perl OO "Object-Oriented Perl" Damian Conway Manning Publications, http://www.manning.com/Conway/index.html 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 AUTHOR AND COPYRIGHT 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. man man https://github.com/man-pages-zh/manpages- zh perl v5.8.3 2003-11-25 PERLFAQ3(7)