本文和大家重点讨论一下Perl常见问题, Perl有足够的弹性和扩充性,从只需要写短短一行的档案处理工作到复杂的系统,几乎没有什麽做不到的。对有些人来说,Perl的是拿来做写shell程式的理想替代品。
Perl常见问题集锦
◆Perl常见问题一:Perl和其他的程式语言比起来如何?例如Java,Python,REXX,Scheme,或Tcl?
Perl在某些地方比较好,某些地方较差。精确地说到底哪些方面好或坏通常视个人偏好而定,所以在新闻讨论群中问这种问题很可能会掀起一场毫无建设性的圣战。
要比较各语言的异同***的方法是试着用不同的语言写功能相同的程式。各程式语言都各有属於它们各自的新闻讨论群,您可从中学习(但希望您不是去和人辨论吵架的)。
◆Perl常见问题二:我可以用Perl来做【某种差事】吗?
Perl有足够的弹性和扩充性,从只需要写短短一行的档案处理工作到复杂的系统,几乎没有什麽做不到的。对有些人来说,Perl的是拿来做写shell程式的理想替代品。其他人则用高阶的Perl来替代处理许多原先需要用C或C++一类的低阶语言来达到的程式。哪些差事决定要用Perl来处理,这一切都得看您(或许还有您的经理...)。
如果您有一个提供API的程式库的话,您可用C或C++来写一个Perl延伸,然後便可透过它将程式库中的任何一部分动态载入您的Perl主程式中。您也可以反过来,用C或C++来写主程式,然後以即时动态载入的方式插入一些Perl程式码,产生一个威力强大的应用程式。
话虽如此,对解决某些特定的问题,使用小型、专精,专为特殊用途设计的语言总是比较方便的。Perl的设计是尽力地满足各种不同人的需要,因而不特别偏颇任何人。至於特殊功能语言的例子,随便举两个,譬如prolog和matlab便是。
◆Perl常见问题三:哪些场合下不适合用Perl?
当您的主管禁止的时候--不过请务必考虑把他们换掉。
说真的,如果您已经有用另一个语言写成的应用程式(而且写得很好)的时候,或者是已经有替某些特定的工作设计的语言(例如:prolog,make),这个时候就不需要用Perl。
由於种种因素,Perl大概不太适合拿来做即时内嵌式系统、属於低层级的作业系统发展工作,例如周边设备的drivers或环境转换码、复杂的多线共用记忆体应用程式,或非常大的应用程式。您会发现Perl本身便不是以Perl写成的。
刚出炉的Perl纯码编译器或许可帮忙去除一些上述的限制,但您要了解:Perl在本质上仍是一活性变数语言(dynamicallytypedlanguage),而非固性变数(staticallytyped)。只要您不将核电厂或脑科手术监视器所用的程式放心地用Perl来写,您自然就不会闯祸遭殃。这样Larry晚上也可以睡得安稳些--股市分析程式不在此限。
◆Perl常见问题四:「perl」和「Perl」有什麽不同?
二者差一个位元。喔,您不是说在ASCII上的差别啊?Larry现在用「Perl」来代表语言本身,而以「perl」来表示该语言的体现,即目前的解译器。因此,作者有句幽默小语说:「只有perl可以解译Perl」。要不要遵照这个用法是您的自由。举一反叁的话,我们可依样画葫芦地说「awk和perl」还有「Python和Perl」,但却不可将「awk和Perl」或是「Python和perl」摆在一起。
◆Perl常见问题五:Perl程式应算是program还是script?
都无所谓。按标准术语来讲,program指已经由编译程序编译好、转为机器码,可多次执行的程式;而script则是每次执行时都必须透过一个解译程式来解译。然而,Perl程式严格说来,既非编译(compiled),亦非解译式(interpreted);因Perl程式可转译成位元码形式存在(可说是某种Perl虚拟机器[virtualmachine]),或转译为完全不同的语言,如C或组合语言。所以光看原始码很难说它到底是替纯解译器、或是parse-tree解译器、位元码解译器,还是纯码编译器而写;因此这题很难给它一个确切的答案。
◆Perl常见问题六:JAPH是什麽?
这是过去一些在讨论群中自称``justanotherperlhacker''的人的签名档,约有一百个比较早期的,可在http://www.perl.com/CPAN/misc/japh取得。
◆Perl常见问题七:到哪儿可拿到LarryWall的智慧讽语(witticisms)?
一百多条Larry的讽语,源自他【在讨论群】的posts或原始码,可在http://www.perl.com/CPAN/misc/lwall-quotes取得。
我要如何取信、说服我的系统管理者/上司/属下使用第5/5.004版的Perl,而不去用其他的语言?
如果您的管理阶层或属下对没有支援的软体,或是未正式包含在所购买的作业系统中的软体存有戒心的话,您可以试着从有助他们自身利益这方面下手。因为如果程式设计师能由善加利用Perl的结构、功能性、简单性,和威力而获得更大的生产力的话,那麽典型的管理者/上司/员工或许便可因而加以说服。此外,使用Perl,总的来讲,和其他语言相较,或许也有助於减少交件的时间。强调这个论点或许对说服他们会有帮助。
如果您的专题碰到瓶颈,特别是有关转译或测试方面的问题,那麽Perl可以说绝对会是一个既可行且快的解决之道。您在当说客的时候,千万别忘了要提:Perl已被世界上许多大型的软硬体公司广泛、大量地使用,极为可靠、有效。事实上,现Perl已成为许多Unix业者所售的作业系统的标准配备了。而且如果您无法在详尽的使用说明,包括这份FAQ之中为您的问题找到解答的话,送封post到新闻讨论群即可。
如果您面对反对perl升级的声音,那麽告诉他们Perl发展小组已经完全不再维护或支援第四版的perl了。perl5的另一个大卖点是它有大量的模组和延伸,可大大减少计画的发展时间。还有,告诉他们第四和第五版Perl之间的差异就如awk和C++的差别一样(嗯,或许没有差得那麽明显,但您知道我的意思就好)。如果您想得到支援而且想确保您现在所发展的软体在未来能继续工作的话,那麽您得跑有支援的版本。这大概也就是说要跑5.004版的,尽管5.003版仍算是不错(它只落後一年、一版)。不过因为有些严重的bugs曾在5.000和5.002版之间被消除,所以您至少应升级到比这几个版本高才是。#p#
◆Perl常见问题八:哪些平台上有Perl?要到哪里去找?
Perl的标准发行版(由perl发展小组负责维护)仅以原始码形式发行。您可在http://www.perl.com/CPAN/src/latest.tar.gz处取得。这个档案的格式是POSIXtar档案柜,再以gzip格式压缩。这套原始码完全不需任何移植工作便可轻易地在绝大多数的Unix系统(Perl的原生系统),以及Plan9、VMS、QNX、OS/2,和Amiga上编译安装完成。尽管有谣传说(即将推出的)第5.004版或许能直接在WindowsNT上成功地编译和安装,但这尚待证实。适合32位元的微软系统和苹果系统、以执行档形式发行的Perl各可在http://www.perl.com/CPAN/ports/这个目录底下找到。由於这两个不属於标准发行的一部分,它们可能(事实上的确)和基本的Perl有多方面的不同。要确切知道到底哪些地方不同,您得自行查阅它们 各自的发行说明。这些差异可能是正面的(譬如它们可能附有一些原始码发行的perl所没有的延伸,提供专属某一平台的特殊功能),亦或负面的(例如它们可能是植基於比较老旧的Perl原始码发行版)。
一个实用、专为Win32Perl使用者编写的FAQ可在 http://www.endcontsw.com/people/evangelo/Perl_for_Win32_FAQ.html处取得。
◆Perl常见问题九:要如合取得以执行档形式发行的Perl?
不管为什麽您的作业系统业者没有将C编译器附在所卖的作业系统中,***的方法是到网路上去抓一份gcc的执行档,然後用它来编译perl。CPAN上所放的gcc执行档仅专门提供几个特别难拿到免费编译器的平台,而不是给任何Unix系统的。
您的***步应该是查看http://www.perl.com/CPAN/ports这个档案,看看可以拿到哪些安装资料。http://www.cs.ruu.nl/~piet/perl5dos.html提供了一份有关在DOS上安装perl的资料;而http://www.cs.ruu.nl/~piet/perlwin3.html则是关於在Windows3.1上安装的资料。
◆Perl常见问题十:我的系统里没有C编译器。要如何编译perl?
因为您没有C编译器,您是没指望了,而您的经销商则该拿去当作祭拜列位升阳神的供品。不过说这些风凉话无济於事。
您首先需要做的是替您的系统找一个gcc的执行档。参阅和您的作业系统相关的各UsenetFAQs,看到哪里可以找到这种作业系统的gcc执行档。
我直接将Perl的执行档从一台机器上复制到另一台机器上,但是程式跑不起来。那大概是您忘了复制程式库,或者是程式库的路径不同的关系。您真的应该在那台要安装perl的机器上将整套发行从头编译,然後打makeinstall来安装。其他的方法大多注定要失败。
有一个简单的方法可用来检查和确定东西有没有装对地方--把编入perl的@INC阵列(perl用它来寻找程式库的路径)印出:perl-e'printjoin("\n",@INC)'
如果这个指令列出了任何在您系统上不存在的路径,那麽您或许得将适当的程式库移到这些地方,或者制做适当的symlinks、aliases或捷径。
您或许会想看看HowdoIkeepmyownmodule/librarydirectory?。
我抓回了原始码,试着编译perl,但是gdbm/dynamicloading/malloc/linking/...部分失败。要如何将它搞定?
细读INSTALL这个档案,这是原始码发行版里面的一个档案。有时候自动设定程式(Configure)对某些较不寻常的系统、平台特质、或变异会不知所措。该档案对该如何处这类的问题,大都有详细的说明。
◆Perl常见问题十一:Perl有哪些模组和延伸?CPAN是什麽?CPAN/src/...又代表什麽?
CPAN代表的是「大Perl档案库网络」(ComprehensivePerlArchiveNetwork),一个在全世界数十台机器之间相互映射的巨大档案库。CPAN包含了原始码、对各非原生系统的移植、使用说明、程式,以及许多由第叁类团体所写的模组和延伸,从各商业品牌的资料库介面、到键盘/萤幕控制,乃至全球资讯网漫游及CGI程式皆一应具全。CPAN的总主机是ftp://ftp.funet.fi/pub/languages/perl/CPAN/,但您也可以透过这个位址:http://www.perl.com/CPAN/CPAN.html来自动连接一个在地理位置上最接近您的站。至於这个设计的运作原理,请看http://www.perl.com/CPAN(最後头没有斜线)的说明。
CPAN/路径/...是CPAN站台上头的档案的命名规范。CPAN代表一个CPAN映射的基准目录,然後其馀的路径是由该目录到一个档案的路径。例如,如果您使用ftp://ftp.funet.fi/pub/languages/perl/CPAN来做您的CPAN站,那麽CPAN/misc/japh这个档案便可以从ftp://ftp.funet.fi/pub/languages/perl/CPAN/misc/japh抓下来。
由於目前CPAN档案库中已经有数百个模组,因此几乎任何您所能想到的用途,大概都已经有现成的模组可以办到。目前在CPAN/modules/by-category/底下的类别包括了perl核心模组、协助发展模组、作业系统介面、网路、周边设备、不同processes间之沟通、资料型态工具、资料库介面、使用者介面、与其他语言介面、档名、档案系统、档案锁定、软体国际化及地方化、全球资讯网支援、伺服软体工具、档案库和档案压缩、图形变换处理、电子邮件及新闻讨论群、程式流程控制工具、filehandles和输入/输出、微软视窗模组,以及杂项模组等。
◆Perl常见问题十二:是不是有一个经ISO【国际标准局】或ANSI【美国国家标准局】认可的Perl版本?
当然没有。Larry认为他得先被认可後然後才会轮到Perl。
◆十三Perl的相关资料要上哪儿找?
perl的发行版中都附有完整的使用说明中。如果perl已安装在您的机器上,那麽使用说明应该也已经装在上头了:如果您用的是一个像Unix的系统,您可以打manperl。这同时会带领您到其他重要的使用说明页。如果您用的不是Unix式的系统,那麽查阅使用说明的方法会有所不同;譬如说,使用说明可能会以HTML格式来存放。不管怎麽样,只要perl正确地安装,查阅使用说明应该不成问题。
如果您的系统没有man这个指令,或者是该指令安装不当,那麽您可以试试perldocperl。如果还不成,您可以在/usr/local/lib/perl5/pod这个目录下找使用说明。
如果以上的方法全失败,那麽您可求助於CPAN/doc这个目录,该目录底下存有完整的使用说明,有各种不同的格式,包括了原始的pod格式、troff、html,以及纯文字式。还有http://www.perl.com/perl/info/documentation.html这个网页可能也会对您有帮助。
另外值得一提的是,在CPAN/authors/id/BMIDD这个目录底下有一个完整的PDF版本的使用说明。
【编辑推荐】