Perl 速查 — 简明参考
Perl 5.38 语法、正则、引用与最常用内置函数速查手册,覆盖约 80% 日常场景。
Perl Perl 5.38
perl 5 (interpreter) · 多范式(过程式 · OO · 函数式) · 动态
学习路径
先学会 perl hello.pl 运行与 use strict/warnings → 掌握标量、数组、哈希与流程控制 → 深入子程序与上下文 → 用引用构建复杂数据结构 → 用正则处理文本 → 理解 eval 错误处理与 bless 面向对象 → 再按需学线程、网络、时间与 CPAN 模块。FAQ 节适合回头避坑。
1.Hello World 与构建环境
运行 Perl 脚本、use strict/warnings 与命令行工具。
最小程序
保存为 hello.pl,用 perl hello.pl 运行。use strict 与 use warnings 是标配。
运行与解释
perl 直接解释执行脚本;-c 只做语法检查,-e 执行单行代码。
shebang 与参数
#!/usr/bin/perl 声明解释器;命令行参数存于 @ARGV,$0 是脚本名。
输出与格式化
print 不换行、say 自动换行;printf 格式化、sprintf 返回字符串。
读取输入
<STDIN> 读取一行(含换行);chomp 去掉末尾换行;EOF 返回 undef。
引号运算子
q() 单引号语义、qq() 双引号语义、qw() 单词列表、qx() 命令替换。
use strict/warnings
use strict 强制声明变量并禁裸字;use warnings 打开运行期警告。现代 Perl 标配。
perldoc 文档
perldoc 随 Perl 安装,查函数、模块、内置变量与语言教程。
2.变量与常量
标量/数组/哈希声明、my/our/local/state 与常量定义。
变量声明
三种符号标识三种容器:$ 标量、@ 数组、% 哈希。my 声明词法变量。
标量类型
标量存一个值:数字、字符串或引用。字符串与数字自动互转。
数组操作
数组是元素列表。push/pop 操作末尾,shift/unshift 操作开头,下标从 0 起。
哈希操作
哈希是键值对,键为字符串。keys/values/each 遍历,exists/delete 管理。
常量定义
use constant 定义编译期常量,无符号、像子程序一样调用。
作用域
my 词法变量块内可见;our 包变量全局;local 临时覆盖全局;state 静态词法。
默认变量
$_ 默认输入变量,@_ 参数列表;$! 系统错误、$0 脚本名等特殊变量常用。
字符串插值
双引号里 $scalar 与 @array 会插值;单引号原样输出;花括号限定变量边界。
3.数据类型
标量、undef、真假值、列表与哈希、文件句柄与 typeglob。
标量类型
标量是唯一基本类型,可存整数、浮点、字符串或引用。无需显式声明类型。
数字字符串互转
按上下文自动转换:+ 数值、. 拼接。显式转用 +0 与 .""。
undef 与 defined
undef 表示未定义,在数值上下文是 0、字符串上下文是空串。defined 判断。
布尔真假
假值只有 undef、0、"0"、空串;其余全真。逻辑运算符返回操作数。
数组与列表
列表字面量 (1,2,3)、qw 单词列表、范围 1..5。上下文决定整体或元素。
哈希键值对
胖箭头 => 自动给左边加引号;键值成对出现,键是字符串或整数。
文件句柄
STDIN/STDOUT/STDERR 是内置句柄;open 词法句柄读写文件,三参数形式最安全。
typeglob
* 前缀表示符号表项,可给标量/数组/子程序起别名。现代代码少用。
4.引用与解引用
Perl 用引用替代指针:反斜杠取址、解引用、箭头操作与嵌套结构。
引用基础
反斜杠 \ 对变量取引用,得到引用类型的标量;ref 函数返回类型名。
解引用
@$ref、%$ref、$$ref 把引用还原为对应类型;花括号形式 ${$ref} 更醒目。
箭头操作符
-> 解引用嵌套结构:$ref->[0] 与 $ref->{key},逐层链接。
匿名引用
[] 匿名数组、{} 匿名哈希、sub {} 匿名函数;直接构造无需命名变量。
嵌套结构
数组套哈希、哈希套数组等复合结构;遍历时逐层解引用。
引用传参
传引用避免复制大数组、可就地修改调用方数据;函数返回引用更高效。
bless 与对象
bless 给引用打上类标签成为对象;ref 之后返回类名。对象本质是引用。
引用比较
引用比较地址用 ==;ref 判断类型;引用计数管理生命周期。
5.流程控制
if/unless、后缀式、for/foreach/while 与 next/last/redo。
if/elsif/else
if 判断真假值;elsif 链式;unless 反向判断。条件无括号要求。
unless 与 until
unless 是 if 的否定、until 是 while 的否定;do-until 至少执行一次。
后缀式控制
if/unless/for/while 可放在单语句后,是 Perl 惯用法。只修饰一条语句。
for/foreach 循环
for 可写 C 风格或遍历列表;foreach 是别名。不指定变量时用 $_。
while 循环
while 条件为真即执行;读文件用 while 逐行最惯用;do-while 先执行一次。
next/last/redo
next 跳过本轮、last 退出循环、redo 重做本轮;标签控制嵌套循环。
三目与短路
?: 条件表达式;|| 与 // 提供默认值;逻辑运算返回操作数。
goto 与标签
goto 跳转标签(限制版);多层退出优先用带标签的 last。日常代码极少用 goto。
6.函数与子程序
sub 定义、@_ 参数、返回值、闭包、原型与签名。
函数定义
sub 定义命名子程序,最后一个表达式自动返回。调用时用括号传参。
@_ 与参数
参数列表存于 @_;shift 取出第一个;@_ 元素是别名,就地修改会外泄。
返回值
返回标量或列表由上下文决定;wantarray 判断调用上下文;返回引用避免复制。
匿名子程序
sub {} 创建函数引用,用 ->() 调用;可作回调、存数组或哈希。
闭包
闭包捕获词法变量并记住状态;每次调用工厂函数得到独立副本。
原型
原型在编译期约束参数上下文,如 (\@) 强制数组引用。现代代码建议用签名。
函数签名
feature 'signatures' 提供声明式参数(5.36+ 稳定);支持默认值与数组参数。
函数引用
\&sub 取函数引用,->() 或 &$ref() 调用;用于回调、调度表与高阶函数。
7.字符串
引号、插值、拼接、格式化、子串与编码处理。
字符串字面量
单引号原样、双引号插值;q()/qq() 等价;相邻字符串自动拼接。
插值规则
双引号内 $scalar 与 @array 插值;花括号限定边界;索引/解引用也可插值。
拼接与重复
. 拼接字符串、x 重复、join 连接数组;length 求长度、reverse 反转。
子串与查找
substr 取/改子串;index/rindex 查找位置(找不到返回 -1)。
chomp 与 split
chomp 去掉末尾换行;split 按分隔符拆成列表;join 是逆操作。
printf/sprintf
printf 直接输出,sprintf 返回字符串;%d/%s/%f 等格式与补零对齐。
大小写与清洗
uc/lc/ucfirst 改大小写;用替换正则去空白;tr/// 字符翻译。
编码与 UTF-8
use utf8 标记源码;encode/decode 转码;带编码层读写文件。
8.集合与数据结构
数组/哈希操作、切片、map/grep、排序与 List::Util。
数组增删改
push/pop/shift/unshift 四个端点操作;splice 中间插入删除;reverse/sort。
切片
@arr[...] 取数组切片、%hash{...} 取哈希切片;切片可整体赋值。
列表运算
sum/min/max 来自 List::Util;grep 去重、范围取值、列表解构。
map 与 grep
grep 过滤、map 变换,都按 $_ 迭代。标量上下文 grep 返回命中数。
哈希遍历
keys/values 取键值列表,each 键值对遍历;exists/delete 管理。
哈希惯用法
哈希做计数、去重、集合、缓存与分组。遍历中的增删要小心。
排序
sort 默认字符串序;自定义比较块用 <=> 数值、cmp 字符串。
List::Util
sum/sum0/min/max/first/reduce/any/all/shuffle。sum0 空列表返回 0。
9.内存与性能
引用计数、循环引用、弱引用、自动活体化与性能基准。
引用计数
Perl 用引用计数自动回收内存,无需手动 free。计数归零即释放。
循环引用
对象互相引用使计数永不归零导致泄漏;用弱引用或手动破环解决。
弱引用
Scalar::Util::weaken 让引用不增计数;目标回收后弱引用变 undef。
作用域释放
词法变量与句柄在离开作用域时自动释放/关闭;undef 可提前释放。
自动活体化
给未定义引用赋值时自动创建容器;写很方便,读嵌套时可能误创建。
分配与提速
预分配数组、预编译正则、少用插值拼接;先测后优化。
内存度量
Devel::Size 测量结构占用;观察内存峰值;大文件流式处理。
性能基准
Benchmark 模块对比实现;Time::HiRes 高精度计时。
10.面向对象
bless 引用、方法、继承、访问器、运算符重载与 Moose/Moo。
bless 构造
bless 把引用打上类标签成为对象;对象本质是带类名的引用。
方法与调用
-> 左侧是对象、右侧是方法;方法第一个参数是 $self。
继承
use parent 声明父类;子类覆盖同名方法;父类方法可复用。
构造函数
new 接收类名与参数,返回 bless 对象;可提供多种构造方式。
封装与访问器
把字段访问封装成方法,写访问器可加校验;避免外部直接改字段。
运算符重载
use overload 定义 +、"" 等运算符;让对象像数值/字符串一样参与运算。
Moo/Moose
Moo 轻量对象系统:has 声明字段、自动生成访问器、extends 继承。
角色与组合
Moo::Role 定义可复用方法集合,with 引入;组合优于继承。
11.错误处理
die/warn、eval 捕获、Try::Tiny、Carp 与自定义异常。
die 与 warn
warn 打印警告不退出;die 打印并终止;die 可抛字符串或对象。
eval 捕获
eval BLOCK 捕获异常,出错置 $@;成功返回块内最后表达式。
$@ 处理
$@ 保存最近错误;可匹配字符串或检查对象类型;区分 undef 与异常。
Try::Tiny
try/catch/finally 结构清晰,$_ 承载错误;解决 $@ 竞态。
Carp 报错
croak/carp 报调用者位置;confess/cluck 带堆栈。库代码更友好。
自定义异常
die 对象并用 ref/isa 判断;重载 "" 让字符串化友好。
autodie
autodie 让 open 等系统调用失败自动 die,省去手写 or die。
错误处理模式
or die 惯用法、提前校验、失败即早返回;顶层 die、库内部返回。
12.文件 I/O
open 读写、钻石操作符、slurp、编码、路径与 JSON。
打开与读取
三参数 open 读取文件,逐行 while 最省内存;-e/-f 判断文件属性。
写入与追加
> 覆盖写、>> 追加写;print/printf 写句柄;umask 控制权限。
钻石操作符
<> 读参数文件,无参数读 STDIN;$. 是累计行号,$ARGV 是当前文件名。
读取整个文件
local $/ 置 undef 一次读完;File::Slurper 提供 read_text 便捷函数。
binmode 与编码
binmode 二进制安全;<:utf8 层读写 UTF-8;raw 去掉编码层。
标准句柄
STDIN/STDOUT/STDERR;复制句柄、判断终端、立即刷新。
路径操作
Cwd 当前目录、File::Spec 跨平台拼接、glob 匹配文件、File::Find 递归。
JSON 处理
JSON::PP 是核心模块:encode/decode、美化、UTF-8。生产可用 JSON::XS。
13.常见误区
Perl 日常开发最容易踩的坑与正确写法。
忘记 use strict
不启用 strict 时拼写错误静默、变量自动全局化。strict 是安全底线。
上下文混淆
标量与列表上下文结果不同:数组在标量上下文是长度。scalar 显式表达。
忘记 chomp
<STDIN> 带回换行,忘 chomp 会导致字符串比较永远失败。
比较运算符混用
== 数值比较、eq 字符串比较。用错会把 "10" 和 "010" 判为相等。
哈希遍历无序
哈希内部顺序不定,依赖遍历顺序会随机出错。需要顺序就排序键。
读取触发自动活体化
读嵌套结构时中间引用被自动创建,内存悄悄增长。短路判空可避免。
local 与 my 混淆
local 临时覆盖全局变量(块外恢复),my 才是词法局部变量。
open 写法过时
双参数 open + 裸字句柄污染符号表且不安全。用三参数 + 词法句柄。
数组标量上下文
数组在标量上下文返回长度、列表返回尾项。取长度用 scalar。
14.多线程
threads 创建线程、threads::shared 共享数据、锁与队列同步。
创建线程
threads->create 启动新线程;join 等待结束并取回返回值。
join 与错误
join 返回线程结果;线程内 die 会传播到主线程,可用 eval 捕获。
共享数据
threads::shared 的 :shared 变量跨线程共享;普通 my 变量是各线程副本。
锁与信号量
lock 保护临界区;Thread::Semaphore 限流。锁在作用域结束自动释放。
线程队列
Thread::Queue 是线程安全队列,dequeue 空时阻塞,适合生产者-消费者。
线程参数
create 的第二参数起是传给子程序的参数;词法变量每线程独立副本。
并行任务
固定线程数抓取任务处理;共享索引原子分配,避免每任务建线程。
线程池模式
队列分发 + 结果队列收集;end 多次调用唤醒多个阻塞线程。
15.网络编程
TCP 套接字、HTTP 客户端、URL 解析与 DNS 查询。
TCP 客户端
IO::Socket::INET 创建连接;print 发送、<...> 读取响应。
TCP 服务端
Listen 监听端口,accept 接受连接;每个连接可回显或交子进程处理。
HTTP GET
HTTP::Tiny 是核心模块;get 返回 status/content,可配合 JSON::PP 解析。
HTTP POST
post 发送任意 body;post_form 自动做 URL 编码提交表单。
URL 解析
URI 模块拆解与构建 URL;query_form 读写查询参数,自动编码。
DNS 查询
Net::DNS 解析 A/MX/TXT 记录;search 返回响应对象,需外部模块。
套接字选项
setsockopt 设置底层选项;timeout 控制阻塞;IO::Select 非阻塞等待。
REST 客户端
封装 HTTP::Tiny 统一处理鉴权与 JSON;错误统一抛给调用方。
16.日期与时间
time/localtime、strftime 格式化、Time::Piece 与 DateTime 处理。
localtime 分解
time 取 epoch;localtime 拆成年月日时分秒,注意月与年的偏移。
strftime 格式化
POSIX::strftime 用 %Y %m %d 等占位符格式化;%A %B 输出星期与月份名。
时间戳转换
timelocal/timegm 把本地或 UTC 时间数组转回 epoch,注意偏移。
sleep 延时
sleep 整数秒;Time::HiRes 支持小数与微秒;select 可做无阻塞等待。
耗时测量
time 秒级计时;Time::HiRes 毫秒级;跨日/时区差异用 DateTime。
DateTime 对象
DateTime 完整时间处理:构造、取值、时区转换与日期算术。
字符串解析
Time::Piece::strptime 按格式解析日期字符串,得到 epoch 与差值。
格式对象
DateTime::Format::Strptime 统一解析与格式化;RFC3339 处理 ISO 时间。
17.进程与命令
system/反引号执行命令、环境变量、@ARGV、信号与管道。
执行命令
反引号捕获输出;system 执行不捕获;列表形式避免 shell 注入。
exec 与 system
exec 替换当前进程;system 等待子进程结束;$? 保存退出状态。
环境变量
%ENV 哈希读写环境变量,影响后续子进程;local 可临时隔离。
命令行参数
@ARGV 是参数列表;复杂参数解析用 Getopt::Long 声明式。
退出状态
exit N 设置退出码;0 成功非 0 失败;END 块在退出前执行。
信号处理
$SIG{INT} 捕获信号;处理函数只设标志,主循环再响应。
进程管道
-| 读子进程输出、|- 写入子进程输入;双向交互用 IPC::Open3。
捕获输出
重定向合并 stdout/stderr;$? 检查退出码;Capture::Tiny 结构化捕获。
18.正则表达式
模式匹配、字符类、量词、捕获组、预编译与替换。
匹配基础
=~ 匹配、!~ 非匹配;锚点 ^ $ \b 定位;i 修饰符忽略大小写。
匹配与提取
g 全局匹配;列表上下文返回所有命中;结合 grep 过滤数组。
字符类
\d \w \s 及其取反;自定义 [...] 与排除 [^...];量词。
量词与回溯
贪婪默认、非贪婪加 ?;占位量词 + 禁止回溯;嵌套量词警惕灾难回溯。
捕获组
$1 $2 按左括号顺序取捕获;(?:) 非捕获;(?<name>) 具名捕获。
具名捕获
(?<name>...) 具名组 + %+ 哈希访问;\k<name> 反向引用。
预编译正则
qr// 编译一次复用;模块内共享提升大循环性能;可带修饰符。
替换与翻译
s/// 替换、g 全局、i 忽略大小写;替换部分可用 $1;tr/// 字符翻译。
19.模块与工程化
模块结构、use/require、选项解析、CPAN 安装与测试。
模块结构
包名对应文件路径;Exporter 导出;1; 结尾让 use 成功。
use 与 require
use 编译期加载并导入;require 运行时加载;do 执行文件不建符号表。
模块安装
cpanm 安装 CPAN 模块;核心模块随 Perl 发布;cpanfile 记录依赖。
Getopt::Long
声明式选项解析:=s 字符串 =i 整数、开关、别名与取反。
常用 CPAN 模块
DateTime/Moose/DBI 等生态;MetaCPAN 检索;eval 探测可用性。
脚本与命令行
shebang 指定解释器;perl -w/-e/-ne 常用命令行选项。
打包与目录
lib/t 目录布局、Makefile.PL 构建;-Ilib 本地开发加载。
Test::More
plan 声明断言数;is/ok/like 断言;prove -l 批量跑测试。
关于本速查
本页是 Perl 5.38 的自包含速查手册,覆盖语言核心与最常用内置函数(含少量 CPAN 模块)在真实项目中约 80% 的常见用法。内容偏向现代惯用法:`use strict` + `use warnings` 必备、后缀式控制流、scalar/list 上下文区分、引用构建复杂数据结构、`say` / `state` / `signatures`。Perl 是 Larry Wall 于 1987 年发布的多范式动态语言,以「不止一种方法做同一件事(TMTOWTDI)」著称,在文本处理、系统管理与 Web 后端领域有深厚积累。权威参考见随 Perl 安装的 `perldoc` 与 [Perl 官方文档](https://perldoc.perl.org/)。 19 个章节各自聚焦一个主题——从第一个程序到引用、bless 面向对象与常见误区。每节拆成 8–14 个带示例的小节(每个 5–20 行),共约 150 个主题。代码片段刻意短小、自解释,复制后可直接用 `perl` 运行。 所有处理都在浏览器中完成——无上传、无追踪。本页是 GuruToolkit 免费开发者工具集的一部分;代码片段可自由使用,无任何担保。
版本 2.1.0