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