Perl

 

使用 Perl 手册页快速获得信息

Perl 手册页命令 perldoc。使用 perldoc perl 来获取所有 perldoc 支持的主题。

perldoc perl
perldoc perldoc
perldoc perlcheat

# 查看所有内置函数信息
perldoc perlfunc
# 快速查看某一内置函数信息
perldoc -f chomp

# 查看所有预定义变量信息
perldoc perlvar
# 快速查看某一预定义变量信息
perldoc -v '$_'

部分 Perl 手册页

手册页 内容 perlfaq 手册页 内容
perl 有哪些 Perl 手册页 perlfaq1 关于 Perl 的一般问题
perldata 数据类型 perlfaq2 获取和学习 Perl
perlsyn 语法 perlfaq3 编程工具
perlop 操作符和优先级 perlfaq4 数据操纵
perlre 正则表达式 perlfaq5 文件和格式
perlvar 预定义变量 perlfaq6 正则表达式
perlsub 子过程 perlfaq7 一般的 Perl 语言问题
prelfunc 内置函数 perlfaq8 系统交互
perlmod Perl 模块如何工作 perlfaq9 网络
perlref 引用    
perlobj 对象    
perlipc 进程间通讯    
perlrun 如何运行 Perl 命令,以及命令行开关    
perldebug 调试    
perldiag 诊断信息    

使用 Perl 命令行对文本进行查找和替换

类似 grep 命令的查找

perl -ne 'print if /PATTERN/'

类似 sed -i 的文本替换

# 只检查替换结果,不修改原文件
perl -ne 'print if s/PATTERN/REPLACEMENT/'

# 在原文件中直接替换
perl -pi -e 's/PATTERN/REPLACEMENT/'

# 将原文件备份到当前目录下的 bak 目录
perl -pi'bak/*' -e 's/PATTERN/REPLACEMENT/'

使用 perldoc perlrun 了解命令行开关 -n, -p, -i

Perl 正则表达式

量词

如果给定的元符号是 可量化 的(能匹配有宽度的东西),则该元符号就是 原子 的。

最大 最小 占有 允许范围
{MIN,MAX} {MIN,MAX}? {MIN,MAX}?+ 必须出现至少 MIN 次,但是不超过 MAX 次
{MIN,} {MIN,}? {MIN,}?+ 必须出现至少 MIN 次
{COUNT} {COUNT}? {COUNT}?+ 必须正好出现 COUNT 次
* *? *+ 0或多次,等同于{0,}
+ +? ++ 1或多次,等同于{1,}
? ?? ?+ 0或1次,等同于{0,1}

最小量词会在允许的范围内匹配尽可能少的字符,最大量词会在允许的范围内匹配尽可能多的字符。占有量词有些像最大量词,只不过其在回溯期间不会放弃任何已经匹配的结果,而最小和最大量词在回溯期间可能改变匹配的数量。

回溯

正则表达式引擎会记录做过哪些尝试,而哪些还没有尝试过,如果一条路走不通,则它会后退,尝试其它路径,这称为 回溯 (backtracking)

字符类

经典 Perl 字符类 中括号字符类 字符属性 POSIX 风格字符类 含义
\d [0-9] \p{POSIX_Digit} [:digit:] 数字
\D [^0-9] \P{POSIX_Digit} [:^digit:] 非数字
\w [_A-Za-z0-9] \p{POSIX_Word} [:word:] 单词字符
\W [^_A-Za-z0-9] \P{POSIX_Word} [:^word:] 非单词字符
\s [\t\n\f\r] \p{POSIX_Space} [:space:] 空白符
\S [^\t\n\f\r] \P{POSIX_Space} [:^space:] 非空白符

大多数单词中是不包括数字和下划线的,但 \w 是按典型编程语言中的 token 来匹配“单词”。

另外,元符号 \w 也可以用在中括号字符类中,例如:

my $var = "hello world-61"
warn "contains word, space or dash." if ($var =~ /[\w\s-]/)

绑定操作符 =~ 对一个特定的字符串应用 m//s///tr/// 操作符。如果没有绑定操作符,则使用特殊变量 $_ 的内容。

/hello/ and /world/     # 在 $_ 中搜索 hello, 如果找到,则继续在 $_ 中搜索 world

s/sugar/apspartame/     # 对 $_ 进行替换

tr/abc/123/             # 对 $_ 进行转换,将字符 abc 转换为数字 123

匹配带中划线(-)的单词

print if /\w+/      # 可以匹配到 spring_boot231,但匹配不到 spring-boot231
print if /[\w-]+/   # 可以匹配到 spring-boot231,