文章会有【原创】或者【转载】标示,部分来自Google Baidu的学习结果 {Java/PHP/Python/Ruby/Go}

一句话perl问答  


0. 本FAQ基于perl什么版本?
perl5

1. 什么是perl?
PERL = Practical Extraction and Report Language(实用摘录和报表语言)

2. 谁是Larry Wall?
perl的创始人,perl之父。

3. 什么是CPAN?
CPAN = Comprehensive Perl Archive Network
主力站:  http://www.cpan.org/
清华镜像:http://cpan.mirror.edu.cn/

4. 什么是O'Reilly?
一个曾经出版而且现在仍然在出版很多堪称经典的计算机图书的出版商
中国的代理是中国电力出版社,如果想节省时间,可以看其代理的中译本

5. 程序员的三大美德是什么?
傲慢、急躁,以及懒惰(hubris,impatience and laziness)

6. 如何有效的提问                                                                 
    你先看看自己的问题有没有人已经问过,而且已经有人回答过。重复回答            
问题是很令人厌烦的。而且当你得到'请看精华区x-xx'、'版面搜xx'这样的回            
答,恐怕也很不好意思。                                                         
    首先请通读本文,这里包括了很多最常见的问题。                              
    其次使用版面搜索功能。telnet方式下输入'/'或'?',Ctrl+g 6可以对标题         
关键字进行搜索。Ctrl+g 8可以对精华区进行搜索。对于本文,在telnet方              
式下输入'/',可以在全文搜索。                                                   
    如果没有人提问过,那么先想想这个问题是不是自己可以解决。最简单的方         
法就是看文档。perldoc和ActivePerl的文档都是相当好的教程。                       
    最后如果你要提问,请尽量详细描述你的问题,如果是出现错误,请给出错         
误信息,有可能的话,可以给出源码。                                             
                                                                                

------------------------B. 本版推荐书籍-----------------------
1. <<Learning Perl>><<Perl语言入门>>
一星期入门必读

2. <<Programming Perl>><<Perl语言编程>>
很好的参考书,和perldoc的很多内容是一致的

3. <<Advanced Perl Programming>><<高级Perl编程>>
进阶必读

4. <<Perl Cookbook>>
perl分类例程的集合

5. <<Perl in a Nutshell>>
精炼的perl读物

6. <<Learning Perl on Win32 System>>
win32下的perl

------------------------C. 常见特殊变量-----------------------
1. $_
$ARG,常常是一个默认变量

2. @_
@ARG,子例程参数表

3. $0
$PROGRAM_NAME,本程序的名字

4. @ARGV
本程序的命令行参数表

5. $"
$LIST_SEPARATOR,数组内插到双引号字符串中时所用的分隔符,
默认为空格

6. $,
$OFS,或$OUTPUT_FIELD_SEPARATOR,用于print的输出字段分隔符,
即一个print语句中用逗号分隔的部分之间用什么分隔,默认为无

7. $\
$ORS,或$OUTPUT_RECORD_SEPARATOR,用于print的输出记录分隔符,
即一个print语句结束时末尾添加什么,默认为无

8. $/
$RS,或$INPUT_RECORD_SEPARATOR,输入记录分隔符,改变了readline,
<FH>和chomp对于“行”的看法,默认为换行符

9. $.
$NR,或$INPUT_LINE_NUMBER,最后读取的“行”号(注意行的概念可能
被8所改变)

10. $|
$AUTOFLUSH,或$OUTPUT_AUTOFLUSH,输出缓冲区开关,默认为0,即关

11. $$
$PID,或$PROCESS_ID,本脚本的进程号(PID)

12. $!
$ERRNO,或$OS_ERROR,上一次系统调用错误值

13. $@
$EVAL_ERROR,上一次eval操作错误值

14. $^I
$INPLACE_EDIT,现场编辑的备份文件扩展名

15. %ENV
当前环境变量

16. 与正则表达式相关的几个量
|<-($`)->|<-($&)->|<-($')->|
/ ------- mmmmmmmm ++++++++/ => 正则表达式(注意:空格不代表实际空格)
|       |匹配部分|
0  ($-[0])      ($+[0])

17. $^O
操作系统名称。
或者
use English;
print $OSNAME;
或者
use Config;
print $Config{'osname'};

------------------------D. 模块安装及使用部分-----------------------
1. 在Unix/Linux下如何为perl安装模块?
perl -MCPAN -e shell (也可以直接用cpan这个命令)
或看x-8-2

2. 如何到ftp.tsinghua.edu.cn/mirror/CPAN安装?
x-13-1-5

2. 在Win下如何为ActiveState Perl安装模块?
ppm
或看x-8-2

3. 如何为ppm使用代理?
set http_proxy=http://proxyip:port

4. 有日志模块吗?
x-13-2-1

5. 有PGP模块吗?
x-17-1-1

6. 如何在运行时将perl脚本所在目录添加到模块搜索路径中?(perlfaq8)
   use FindBin;
   use lib "$FindBin::Bin";
   use your_own_modules;

7. 在Win下如何刷新ActiveState Perl的HTML帮助?
    手动安装模块后,ActivePerl的HTML帮助文件不会自动更新,用下面的
命令就能强制刷新了:
perl -MActivePerl::DocTools -eUpdateHTML

-----------------------E. 数据库操作部分----------------------
1. perl的数据库通用接口?
DBI

2. perl连接mysql/postgreSQL的例子?
x-6-3

3. perl连接SQLserver的例子?
x-6-4和x-6-12

4. perl连接Access的例子?
x-6-9

5. 使用ms odbc driver的时候出现错误“操作必须使用一个可更新的查询”?
ADO不能写数据库,通常是因为:(1)匿名帐号无写权限;(2)数据库没有用正确的模式
打开;(3)DSN的只读选项被选中;(4)同时更新两个表中的字段;(5)版本不匹配(eg.
Access 97与Access2k)

-------------------F. 网络安装与网络编程部分-------------------
1. 如何将perl与Apache整合?
x-8-3

2. 如何将perl与IIS整合?
x-8-5

3. 能像asp, php那样把perl语句嵌入html中去吗?
Apache::ASP

4. 我写的perl cgi出现错误 Premature end of script headers ?
x-4-7-6

5. 如何用perl抓包?
Net::RawIP
x-7-3

6. 如何处理中文超链接?
(1) URI::Escape
(2) $value =~s/([^a-zA-Z0-9_\/\-.])/uc sprintf("%%%02x",ord($1))/eg;
(3) $a="%b0%a2%b7%c9%d5%fd%b4%ab";
    $a =~ s/%(..)/chr(oct("0x$1"))/eg;

-----------------------G. 图形图像部分----------------------
1. 哪里有perl写的计数器的例子?
x-12-1-3

2. 可以用perl来做复杂的图形操作么?
用Image::Magick,见x-12-1-4

3. Tk的界面不能显示中文?
对于Tk800.023需要打补丁:perltk800.023-011012jp.patch.gz
参考http://www.lehigh.edu/~sol0/ptk/
Tk804以后的版本(也就是现在的版本)所有字符串都是utf-8编码的,所以中文也要转换成utf-8编码才能正常显示,例:
use Tk;
use Encode;
$name="这是标签";
$name=decode("cp936",$name);
$mw=new MainWindow;
$mw->Label(-text=>$name)->pack;
MainLoop;

4. Win32下如何去除Tk程序运行时出现的控制台窗口?
(1)、用wperl代替perl来解释运行.pl程序,应该只对ActivePerl有用,中央发布版不知道
有没有这个命令。
(2)、ActivePerl装上PDK以后,可以用perlapp --gui来把.pl程序编译成.exe,运行时也
不会跳出那个讨厌的窗口。
(3)、来自PerlCookBook的做法是,在程序中加入如下代码
        BEGIN {
                if($^O eq 'MSWin32') {
                        require Win32::Console;
                        Win32::Console::Free();
                }
        }
但是其缺点是窗口还是会跳出来一下,一闪即逝,不是很完美。

--------------------H. 编辑工具与编译部分-------------------
1. 推荐什么编辑工具?
vim(Linux)/gvim(Win)
Emacs (Linux/Win)

2. 其他较好的Windows下的编辑工具?
DzSoft Perl Editor/Visual Perl Editor/Komodo/Perl Express/

3. perl编译器?
perlcc
perlapp & perl svc (activeperl)
perl2exe

4. 如何把perl代码转换成带有语法色彩的html?
用vim,按:进入命令行模式,输入
so $VIMRUNTIME/syntax/2html.vim

-----------------------I. 专项应用部分----------------------
1. bioperl
http://www.bioperl.org

----------------------J. 正则表达式部分---------------------
1. 正则式中的\A(\z)与^($)有什么区别?
\A只匹配字符串开始位置
^正常情况下匹配字符串开始,如果加上m修饰符,也可以匹配换行符后面的位置
\z和$与上面个相对应
\Z匹配字符串末的位置,如果末尾有个换行符那么他也可以匹配换行符前面的位置
所以\A和\z是对于单纯的字符串来的,不匹配首尾
而^$不用m提醒他的话和上面两个一样,提醒了就只认\n新行符
\Z是个智能\z

2. 用正则表达式判断IPV4地址的合法性?
print "$1.$2.$3.$4\n" if /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ &&
($1<256 && $2<256 && $3<256 && $4<256);

------------------K. 常规语法和综合应用部分-------------------
1. 如何读取当前路径中所有子目录中的所有txt文件?
File::Find 或者 自己写代码遍历

2. perl 处理unicode的例子?
有一个ANSI的英文文本和unicode的日文文本,要合成一个文件
格式:
<sid>es<sep>js
...
主干大致如下:
open NEWF,">output.txt";
print NEWF "\xFF\xFE";  #unicode开头
my $seperator = $/;
open EN,$efn or die "Can't open $efn: $!\n";
@es=<EN>;
close EN;
open CN,$cfn or die "Can't open $cfn: $!\n";
binmode CN;
binmode NEWF;
$/="\x0a\x00";  #unicode的日文文件行尾是\x0d\x00\x0a\x00
@cs=<CN>;
close CN;
for($i=0;$i<=$#es;$i++){
        $es[$i] =~ s/\r\n|\n//;
        my $output = "<sig>".$es[$i]."<SEP>";
        $output =~ s/(.)/$1\x00/g;  #输出的英文单字节转为双字节 \x41 => \x41\x00
        print NEWF $output,$cs[$i];
}
close NEWF;

3. LZ77压缩算法的例子?
g-244 和 g-245

4. perl处理C struct
读入的一个例子:
比如一个结构
struct {
        int a;
        char b[20];
}
存入文件a.a
open(FH,"a.a") or die;
sysread(FH,$x,24); # 读入结构长度那么多字节
close(FH);
($a,$b)=unpack("i Z20",$x); # unpack解析成员值,模板字符含义参见perldoc
print "$a\n$b\n";
写(创建)一个结构的例子:
$num=11; #signed integer
$name='zenit'; #char[16]
$sex='m'; #unsigned char
$stream=pack 'i a16 a',$num,$name,$sex;
print FH, $stream;

5. perl有二维数组么?
可以用Array of Array模拟。具体可以参考perldoc perllol