PERLFAQ3 7

中文man手册

PERLFAQ3

NAME
DESCRIPTION æè¿°
AUTHOR AND COPYRIGHT
è¯è

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ä¹å¯ä»¥ä½¿ç¨ Tkå·¥å·ç»ãSx忝 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 (<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 this:

@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;

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æ§è¡æ¶ä¼å¸¦èµ·ä¸ä¸ªå åµç Perlç´è¯å¨ï¼èå®ä¼é¢åç¼è¯ä½ çç¨å¼ï¼å¹¶å¨ä¸äº§çå¶å®å- ç¨åºçæåµä¸ç¨åä¸ä¸ªå®åç©ºé´æ¥æ§è¡ãApache æ©å模ç»äº¦ç» 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 <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é误âæâå®å¨å½ä»¤å模å¼ä¸è·å¾å¥½å¥½çï¼æä¹ä¸è½å¨æµè§å¨ä¸æ- £å¸¸æ§è¡âæ¶ï¼è¯·åçï¼

http://www.perl.org/CGI_MetaFAQ.html

ä»åªéå¯ä»¥å¦ä¹ é¢å对象ç Perl ç¼ç¨ï¼

perltootæ¯ä¸ªå¥½å¼å§ï¼ç¶åä½ å¯ä»¥ååè perlobj å perlbootï¼Perltootï¼perltooc 以å 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