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

  • 相关阅读:
    2. Add Two Numbers
    1. Two Sum
    22. Generate Parentheses (backTracking)
    21. Merge Two Sorted Lists
    20. Valid Parentheses (Stack)
    19. Remove Nth Node From End of List
    18. 4Sum (通用算法 nSum)
    17. Letter Combinations of a Phone Number (backtracking)
    LeetCode SQL: Combine Two Tables
    LeetCode SQL:Employees Earning More Than Their Managers
  • 原文地址:https://www.cnblogs.com/arthurtang/p/2439491.html
Copyright © 2011-2022 走看看