zoukankan      html  css  js  c++  java
  • [转]Perl学习笔记

    本文章转载自:扶凯[http://www.php-oa.com]

    本文原始链接: http://www.php-oa.com/2008/11/15/perl-note.html

    符号
    方括号表示多重性

    好用的模块

    面向对象

    Moose
    MooseX
    Mouse
    Moo
    Mo  # 轻量
    Class::Struct
    Class::Accessor
    Class::Accessor::Fast # 转换类的属性变成方法,可以方便的操作
    Class::Std Class::MethodMaker

    语法解析

    Parse::RecDescent (不推荐,太慢)
    Parse::Yapp Parse::Eyapp
    perl-byacc

    HTML 信息提取

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

    进程管理

    Parallel::Prefork
    Parallel::ForkManager

    开发调试

    local::lib
    PAR::Packer
    Perl::Tidy
    Smart::Comments # 非常方便的做 debug 和进度条打印的工具 函数和变量操作
    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  # 变量内存查看

    文件读写操作

    File::Slurp 更加方便的读写文件
    Directory::Queue::Simple 给文件做成队列使用

    排序

    Sort::Fields # 按一定的分格符排序

    其它

    Number::Bytes::Human # 转换字节之类到人类比较可读的大小

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

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

    Perl 的线程函数
    Perl线程管理

    1

    2

    3

    4

    5

    6

    threads->create()     # 创建子进程,第一个参数是子函数,第二个参数是传给子函数的参数

    threads->join;        # 等子线程结束,取得子线程的返回值.

    threads->is_joinable; # 配合上面用,看看子线程是否运行完了.

    threads->detach;      # 分离子线程,这样父进程不在对这个子进程有责任了,当然也不能 join 了.

    threads->tid();       # 取得当前线程的线程 ID,和进程一样也有 ID ,用来标识每个线程.

    lock($variable)       # 锁定一个标量,数组,hash.这个锁定会直到锁定他的线程超出范围.

    Perl线程信号

    1

    2

    3

    4

    5

    cond_wait($variable)      # 在这个$variable 上等待

    cond_signal($variable)    # 给这个变量发一个信号

    # 让在这个变量(指使用了 cond_wait 的线程)上等待的线程启动,多个进程只会有一个启动.

    cond_broadcast($variable)

    # 和上面一样,但会唤醒所人有线程.每个线程都会接着运行 cond_wait() 之后的代码.

    Perl 中模块的安装方法

    其它所有方法都是过时的,请使用 CPANM 来安装:
    使用CPANMinus 来安装Perl 模块

    Perldoc 的使用方法

    查看模块文档 perldoc :

    1

    perldoc Module::Name

    查找 FQA 的文档:

    1

    2

    perldoc -q shuffle

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

    使用 perldoc 生成 html 来查看:

    1

    2

    perldoc -oHTML -dfilename.html -q "Perl ?6"

    # -o 是用来指定输出的格式,-d 指定名字

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

    1

    2

    perldoc -l module_name

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

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

    1

    perldoc -lm module_name

    直接浏览代码

    1

    perldoc -m YAML

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

    1

    cpanm Pod::Webserver

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

    1

    2

    3

    podwebserver &

    sleep 2

    firefox -remote 'openurl(http://localhost:8020/, new-tab)'

    Perl 中的 Vim 的配置

    在写  Perl 的人中,使用 Vim 的人是最多的,这一定是神器.除了常用的视图模式一定要会使用和常用的快捷键外,有一些对 Perl 的小技巧.比如使用 Ctrl+N 来自动完成 Perl 的标识符.
    不过有个问题,在 Perl 中模块的名字,常常使用 :: 这个冒号来做模块区分.但 Vim 并不认识,所以需要在 .vimrc 中加入如下:

    1

    set iskeyword+=:

    上面这个是在关键字在增量加入一个 : 来做关键字,这样可以直接使用 Ctrl+N 来补全模块名.

    Perl 模块相关使用

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

    1

    $ perl -MModule::Name -e 0

    查看机器上都安装了哪些模块:

    1

    $ perl -MExtUtils::Installed -le 'print foreach ExtUtils::Installed->new->modules'

    看 Perl 内置安装了哪些模块:

    1

    perl -MModule::CoreList -le 'print foreach Module::CoreList::find_modules'

    如何才能知道自己装了哪些 PERL 的模块(单行命令简单版本)?

    1

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

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

    1

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

    给Perl打包成一个执行文件的方法
    (1.安装使用 PAR::Packer

    1

    # cpanm PAR::Packer

    01

    02

    03

    04

    05

    06

    07

    08

    09

    10

    11

    12

    13

    # 使用下面的命令就可以打包了

    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 出了问题,怎么查

    1

    $ scandeps.pl -V -e 'use YAML;'

    可以查出所有的包的依关系

    (3 Floating point exception

    大多是因为 GCC 的版本不一样,建议相同的操作系统和位数

    命名规范

    常量: 大写
    类名: 开头大写
    内部特殊子例程: 大写
    内部特殊变量: 大写
    普通变量: 小写
    普通子例程: 小写

    perl命令行接口

    1

    2

    3

    4

    5

    6

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

  • 相关阅读:
    面试题目——《CC150》链表
    TCP/IP——链路层
    TCP/IP——基本知识
    面试题目——《CC150》数组与字符串
    Java递归算法——三角数字(消除递归)
    Java排序算法——拓扑排序
    Java排序算法——希尔排序
    Python学习笔记——条件和循环
    Python学习笔记——集合类型
    英文写作——冠词的使用(Use 0f Articles)
  • 原文地址:https://www.cnblogs.com/arthurtang/p/2439491.html
Copyright © 2011-2022 走看看