转载自:扶凯[]
perl 学习书籍推荐
1. <<Learning Perl>>
小名叫 <<Perl语言入门>> perl 入门必读,就象别人讲的一周必读perl入门2. <<Programming Perl>>
这个的中文小名叫 <<Perl语言编程>> 这本是进阶,一周后就得多读读这个了3. <<Advanced Perl Programming>>
这是买也买不到的书啊。。<<高级Perl编程>> 这个书好象绝版了,但是个不错的书,可以到 taobao 上找个复印的以上三本是 Perl 从一个新手到进阶到高手一直会要看的。
4. <<Perl Cookbook>>
perl在各种场景中的应用案例集合,中文的只有台湾有,谁有兴趣和我一起到国外团一本回来。很不错的书。5. <<Network Programming with Perl>> <<Perl网络编程>> 只要不是写 web ,这本书必读,可以对很多 Linux 相关的东西了解深多了6. <<Perl Best Practices>> <<perl最佳实践>> 对写程序的风格之类进行提升的,如果照这个写出来的程序,不会被人讲可读性不好的。7.<<Automating System Administration with Perl>> <<使用Perl实现系统管理自动化>> 系统管理的必备书。中文的还要过三个月的样子才会有(注,现在2011.1.23 )Perl 的网站(有人认为 Perl 不能做网站,记录一下)
用Mason开发的网站之一:passport.maxthon.cn 每日访问量千万级别
好用的模块
Number::Bytes::Human # 转换字节之类到人类比较可读的大小 Smart::Comments # 非常方便的做 debug 和进度条打印的工具 Class::Accessor::Fast # 转换类的属性变成方法,可以方便的操作 Memoize # 给函数做 Cache 的,如果函数的返回值非常多变,可以使用这个模块加快速度 Number::Bytes::Human # 给字节转换成人类可读 Web::Scraper # 最好的网页分析模块了,使用的 XPath List::Util # 最好的列表操作,大部分是由 c 写的。性能非常好。 # 常用导出的子函数有 max,maxstr,sum,reduce(列表归并),first(判断元素匹配) List::MoreUtils # 和上面一样,加了几个其它的功能, # 常用导出的子函数有 any,all,none notall,pairwise(同步二个列表操作),eacg_array(同时操作三个以上列表),mesh(数组合并) |
Perl的图形界面程序(Gtk2,TK)
gmusicbrowser mp3播放器
PAC Manager 替换 SecureCRT/Putty 的终端,界面还需要完善 ploader 一个相册管理和上传软件
Perl 的线程函数
Perl线程管理
threads->create() # 创建子进程,第一个参数是子函数,第二个参数是传给子函数的参数 threads-> join ; # 等子线程结束,取得子线程的返回值. threads->is_joinable; # 配合上面用,看看子线程是否运行完了. threads->detach; # 分离子线程,这样父进程不在对这个子进程有责任了,当然也不能 join 了。 threads->tid(); # 取得当前线程的线程 ID,和进程一样也有 ID ,用来标识每个线程. lock ( $variable ) # 锁定一个标量,数组,hash.这个锁定会直到锁定他的线程超出范围。 |
Perl线程信号
cond_wait( $variable ) # 在这个$variable 上等待 cond_signal( $variable ) # 给这个变量发一个信号 # 让在这个变量(指使用了 cond_wait 的线程)上等待的线程启动,多个进程只会有一个启动。 cond_broadcast( $variable ) # 和上面一样,但会唤醒所人有线程。每个线程都会接着运行 cond_wait() 之后的代码。 |
Perl 中模块的安装方法
其它所有方法都是过时的,请使用 CPANM 来安装:
Perl 模块相关使用
查看模块文档 perldoc :
$ perldoc Module::Name |
查看模块是否安装(简单命令版本):
$ perl -MModule::Name -e 0 |
查看机器上都安装了哪些模块:
$ perl -MExtUtils::Installed -le 'print foreach ExtUtils::Installed->new->modules' |
看 Perl 内置安装了哪些模块:
perl -MModule::CoreList -le 'print foreach Module::CoreList::find_modules' |
查看 Perl 模块安装的位置(单行命令简单版本)
$ perldoc -l module_name $ perl -Mmodule_name -e 'print $_ . " => " . $INC{$_} . "\n" for keys %INC' |
如何才能知道自己装了哪些 PERL 的模块(单行命令简单版本)?
$ find `perl -e 'print "@INC"' ` -name '*.pm' - print |
查询当前使用的模块的版本
$ perl -Mmodule_naem -e 'print $module_name::VERSION;' |
查询模块是否安装,和安装的位置
$ perldoc -lm module_name |
给Perl打包成一个执行文件的方法
(1.安装使用 PAR::Packer
# cpanm PAR::Packer |
# 使用下面的命令就可以打包了 pp -c -o Get Get.pl #启动过滤器,来保护自己的 perl 程序 $pp -f Bleach -o hello hello.pl 或者 $pp -f Bytecode -o hello hello.pl #打包成.par #不包含核心模块: $pp -p -o script.par script.pl #包含核心模块: $pp -B -p -o script.par script.pl |
Bleach过滤器是PAR自己实现的,而Bytecode这种过滤方式是Perl的标准格式(需要Perl 5.8.1以上版本支持)
(2 出了问题,怎么查
$ scandeps.pl -V -e 'use YAML;' |
可以查出所有的包的依关系
(3 Floating point exception
大多是因为 GCC 的版本不一样,建议相同的操作系统和位数
命名规范
常量: 大写
类名: 开头大写 内部特殊子例程: 大写 内部特殊变量: 大写 普通变量: 小写 普通子例程: 小写perl命令行接口
# perl -nale -0 给记录符分隔符($/)指定为一个八进制. -a 打开自动分割模式(和-n ,-p 一起才有效). -e 输入多行,使用后不在从参数列表寻找等程序的文件名 -n 让你的脚本 周围围绕循环,也就是讲给脚本中的line当作一个循环体 |
Perl的特殊符号
趣味符
$ 标量 @ 数组[给值时使用=>,记得不要和引用时的->混了] % 散列{ hash} & 子例程,子函数 * typeglob $x{} x名字前面是美元符号($),后面是花括号({}),则其为 hash 元素 $! 系统产生的一些可读的信息,也可能是出错的信息 $_ 子函数参数变量自己本身 <> 数据输入.如果没有指定文件名,则其从标准输入流中自动打开和关闭一系列文件进行读入erl默认的内部变量
$- 当前页可打印的行数,属于Perl格式系统的一部分
$! 根据上下文内容返回错误号或者错误串 $” 列表分隔符 $# 打印数字时默认的数字输出格式 $$ Perl解释器的进程ID $% 当前输出通道的当前页号 $& 与上个格式匹配的字符串 $( 当前进程的组ID $) 当前进程的有效组ID $* 设置1表示处理多行格式.现在多以/s和/m修饰符取代之. $, 当前输出字段分隔符 $. 上次阅读的文件的当前输入行号 $/ 当前输入记录分隔符,默认情况是新行 $: 字符设置,此后的字符串将被分开,以填充连续的字段. $; 在仿真多维数组时使用的分隔符. $? 返回上一个外部命令的状态 $@ Perl解释器从eval语句返回的错误消息 $[ 数组中第一个元素的索引号 $\ 当前输出记录的分隔符 $] Perl解释器的子版本号 $^ 当前通道最上面的页面输出格式名字 $^A 打印前用于保存格式化数据的变量 $^D调试标志的值 $^E在非UNIX环境中的操作系统扩展错误信息 $^F最大的文件捆述符数值 $^H由编译器激活的语法检查状态 $^I内置控制编辑器的值 $^L发送到输出通道的走纸换页符 $^M备用内存池的大小 $^O操作系统名 $^P指定当前调试值的内部变量 $^R正则表达式块的上次求值结果 $^S当前解释器状态 $^T从新世纪开始算起,脚步本以秒计算的开始运行的时间 $^W警告开关的当前值 $^X Perl二进制可执行代码的名字 $_ 默认的输入/输出和格式匹配空间 $| 控制对当前选择的输出文件句柄的缓冲 $~ 当前报告格式的名字 $` 在上个格式匹配信息前的字符串 $’ 在上个格式匹配信息后的字符串 $+ 与上个正则表达式搜索格式匹配的最后一个括号 $< 当前执行解释器的用户的真实ID $<digits>含有与上个匹配正则表达式对应括号结果 $= 当前页面可打印行的数目 $> 当前进程的有效用户ID 包含正在执行的脚本的文件名 $ ARGV 从默认的文件句柄中读取时的当前文件名 %ENV 环境变量列表 %INC 通过do或require包含的文件列表 %SIG 信号列表及其处理方式 @_ 传给子程序的参数列表 @ARGV 传给脚本的命令行参数列表 @INC 在导入模块时需要搜索的目录列表q 相当一个单引号,quote的缩写
qq 相当一个双引号,quote quote的缩写 qr 正规表达式.quote regex的缩写 qw 单词表,quote word的缩写,qw($opt_h $opt_v) qx 执行外部程序,相当反引号