使用 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,
下篇Cron