取势 明道 优术

Perl 学习笔记 3,923 views

作者为 扶 凯 发表

Perl 的网站(有人认为 Perl 不能做网站,记录一下)

用Mason开发的网站之一:passport.maxthon.cn 每日访问量千万级别

符号
方括号表示多重性

好用的模块

面向对象

  • Moose
  • Mouse
  • Moo  # 最值得使用的面象对象的技术,轻量,功能强大
  • Mo  # 轻量
  • Class::Struct
  • Class::Accessor
  • Class::Accessor::Fast # 转换类的属性变成方法,可以方便的操作
  • Class::Std Class::MethodMaker

子函数和方法

  • Hook::LexWrap # 可以直接 hook 子函数的前后
  • Date::Manip::Date; # 对时间进行解析, 任何时间格式都可以

语法解析

  • Parse::RecDescent (不推荐,太慢)
  • Parse::Yapp Parse::Eyapp
  • perl-byacc
  • Data::Section::Simple 直接可以从 __DATA__ 中来读一些数据

HTML 信息提取

  • Web::Scraper # 使用的 XPath HTML::TreeBuilder HTML::TreeBuilder::XPath
  • WWW::Mechanize
  • Mojo::UserAgent # 最好的网页分析模块了,

进程管理

  • Parallel::Prefork
  • Parallel::ForkManager

开发调试

  • local::lib
  • PAR::Packer
  • Perl::Tidy
  • Smart::Comments # 非常方便的做 debug 和进度条打印的工具 函数和变量操作
  • Data::Dumper        # 平时使用的最多的一个打印数据结构的模块, 可以使用 $Data::Dumper::Deparse = 1; 来显示函数引用
  • Hash::MultiValue   #一个 hash 可以有多个值
  • List::Util              # 最好的列表操作,大部分是由 c 写的.性能非常好.
  • # 常用导出的子函数有 max,maxstr,sum,reduce(列表归并),first(判断元素匹配)
  • List::MoreUtils # 和上面一样,加了几个其它的功能,
  • # 常用导出的子函数有 any,all,none notall,pairwise(同步二个列表操作),eacg_array(同时操作三个以上列表),mesh(数组合并)
  • Memoize # 给函数做 Cache 的,如果函数的返回值非常多变,可以使用这个模块加快速度
  • Devel::Size  # 变量内存查看
  • Time::HiRes # 常用这个 gettimeofday 取毫秒级时间,还有个常用功能使用 tv_interval 加前面函数的时间知道逝去时间
  • Scope::Guard # 这个可以让我们在一个代码块退出的时候执行什么东西,如果取消掉使用 dismiss 来调用

文件读写操作

  • File::Slurp 更加方便的读写文件
  • Directory::Queue::Simple 给文件做成队列使用
排序
  • Sort::Fields # 按一定的分格符排序
  • DBIx::Sunny  # 非常好的数据库连接的封装
  • Tie::Hash::LRU # 最久非使用算法

其它

  • Number::Bytes::Human # 转换字节之类到人类比较可读的大小
  • WWW::HarWalk # 用于回放 har 记录,可以用于网页测试,有点象 phantomjs

Perl的图形界面程序(Gtk2,TK)

gmusicbrowser   mp3播放器
PAC Manager     替换 SecureCRT/Putty 的终端,界面还需要完善
ploader         一个相册管理和上传软件

数组和哈希切片

my @names = ("alice", "Bill", "Cathy", "Doug");
my @men = @names[1, 3];

my %nationality_of = (
    'Ovid'          => 'Greek',
    'Tennyson'  => 'Scottish',
    'Poe'            => 'Tacky',
);
my @nationalities = @nationality_of{ 'Ovid', 'Tennyson'};

Perldoc 的使用方法

查看模块文档 perldoc :

perldoc Module::Name

查找 FQA 的文档:

perldoc -q shuffle
# 配合 -f 选项,可以见到标题中含有相关文字的问题, -q 也支持正则

使用 perldoc 生成 html 来查看:

perldoc -oHTML -dfilename.html -q "Perl ?6"
# -o 是用来指定输出的格式,-d 指定名字

查看 Perl 模块安装的位置(单行命令简单版本)

perldoc -l module_name
perl -Mmodule_name   -e'print $_ . " => " . $INC{$_} . "\n" for keys %INC'

查询模块是否安装,和安装的位置

perldoc -lm module_name

直接浏览代码

perldoc -m YAML

在线的本地 Perl 文档
直接安装 Pod::Webserver 的模块就行了,这个可能给你安装的模块都以 pod 显示出来.

cpanm Pod::Webserver

直接使用 podwebserver 的命令就能启动,默认是使用的 8020 的端口来显示,给本地安装好的模块都会正常的显示出来.可以用 -H 来指定主机名和 -p 来指定端口.
建议给 firefox 直接使用下面的命令来加速打开和启用

podwebserver &
sleep 2
firefox -remote 'openurl(http://localhost:8020/, new-tab)'


Perl 模块相关使用

查看模块是否安装(简单命令版本):

$ 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 的模块(单行命令简单版本)?

$ find `perl -e 'print "@INC"'` -name '*.pm' -print

查询当前使用的模块的版本

$ perl -Mmodule_naem -e 'print $module_name::VERSION;'

给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 执行外部程序,相当反引号

来了就留个评论吧! 没有评论