從 基礎語法 到 文字處理,一次學會 Perl
Perl 編程語言完整繁體中文教學網站,包含Perl入門語法教學、範例應用、小測驗與參考資源。 你會學到Perl用法、Perl安裝教學、變數、陣列、雜湊、條件判斷、迴圈、子程序、正規表達式、檔案讀寫,以及 Perl 的物件導向基礎。
Perl 是什麼?
Perl 是一種擅長文字處理、系統管理、自動化與腳本撰寫的通用程式語言。它對於日誌分析、檔案轉換、批次任務、正規表達式處理特別有名。
文字處理很強
Perl 的正規表達式能力非常成熟,常被用在資料清洗、日誌分析與字串抽取。
語法彈性高
Perl 支援多種寫法,適合快速完成腳本任務,但也需要養成良好可讀性習慣。
適合自動化
從批次重新命名檔案到讀寫文字報表,Perl 很適合做日常工具與維運腳本。
| 主題 | Perl 的表現 | 適合情境 |
|---|---|---|
| 字串處理 | 非常強 | 清洗資料、抽取欄位、文字報表 |
| 正規表達式 | 核心強項 | 日誌分析、驗證格式、搜尋取代 |
| 檔案讀寫 | 方便快速 | 批次處理、匯入匯出、文字工具 |
| 系統腳本 | 成熟穩定 | 自動化、排程、維運腳本 |
快速開始
大多數 Linux 與 macOS 環境通常已內建 Perl。Windows 則可安裝 Strawberry Perl 或 ActivePerl。確認是否安裝成功,可先在終端機輸入:
perl -v
如果看到版本資訊,就表示 Perl 可正常執行。
第一支 Perl 程式
建立一個 `hello.pl` 檔案,並輸入最基本的輸出程式。
use strict;
use warnings;
print "Hello, Perl!\n";
接著在終端機執行:
perl hello.pl
它們能幫你提早發現拼字錯誤、變數未宣告、潛在邏輯問題,是 Perl 初學者非常重要的好習慣。
先掌握 Perl 程式的骨架
Perl 程式由「敘述」組成,大多數簡單敘述以分號結尾。註解使用 `#`,而區塊則使用大括號 `{ ... }` 包住。
分號 `;`
多數敘述句結尾需要分號,這是最常見的初學錯誤之一。
註解 `#`
從 `#` 到該行結尾都會被視為註解,不會執行。
區塊 `{}`
條件判斷、迴圈與子程序通常都使用大括號包住程式區塊。
宣告變數
建議使用 `my` 宣告區域變數,讓程式更安全、更容易維護。
use strict;
use warnings;
my $name = "Amy"; # 字串變數
my $age = 20; # 數值變數
print "姓名:$name\n";
print "年齡:$age\n";
Scalar、Array、Hash 是 Perl 最核心的資料結構
| 型別 | Sigil(符號) | 用途 | 範例 |
|---|---|---|---|
| 純量 Scalar | $ |
單一值,例如字串、數字、參照 | my $name = "Tom"; |
| 陣列 Array | @ |
有順序的值清單 | my @colors = ("red", "blue"); |
| 雜湊 Hash | % |
鍵值對資料 | my %user = (name => "Amy"); |
4.1 Scalar 純量
my $language = "Perl";
my $version = 5.38;
my $is_fun = 1;
print "$language 版本:$version\n";
4.2 Array 陣列
my @fruits = ("apple", "banana", "orange");
print $fruits[0], "\n"; # apple
print scalar(@fruits), "\n"; # 陣列長度
push @fruits, "grape";
pop @fruits;
foreach my $fruit (@fruits) {
print "水果:$fruit\n";
}
4.3 Hash 雜湊
my %student = (
name => "小明",
age => 18,
major => "資訊工程"
);
print $student{name}, "\n";
$student{grade} = "A";
foreach my $key (keys %student) {
print "$key => $student{$key}\n";
}
@,但取單一元素時會改用 $,例如 $fruits[0]。Hash 取單一值也用 $student{name}。
條件判斷、迴圈、敘述修飾子
Perl 提供 `if`、`unless`、`elsif`、`while`、`for`、`foreach` 等控制結構,也支援很有特色的「敘述修飾子」寫法。
if / elsif / else
依照條件決定執行哪段程式碼。
unless
當條件不成立時執行,可視為「反向 if」。
while / until
適合重複執行直到條件改變。
for / foreach
遍歷清單或以傳統索引方式控制次數。
my $score = 85;
if ($score >= 90) {
print "A\n";
} elsif ($score >= 80) {
print "B\n";
} else {
print "再加油\n";
}
for my $i (1..5) {
print "第 $i 次\n";
}
my $x = 1;
while ($x <= 3) {
print "x = $x\n";
$x++;
}
print "成年人\n" if 20 >= 18;
數值比較通常用
==、!=、>、<;字串比較則常用 eq、ne、gt、lt。
把重複邏輯包成可重用的函式
Perl 使用 `sub` 來定義子程序。傳入的參數通常會放在特殊陣列 `@_` 中,初學時常用 `my ($a, $b) = @_;` 來取參數。
sub add {
my ($a, $b) = @_;
return $a + $b;
}
my $result = add(3, 5);
print "結果:$result\n";
定義方式
使用 `sub 名稱 { ... }` 來建立子程序。
參數取得
常見做法是把 `@_` 的內容解構到區域變數中。
回傳值
可使用 `return`,也可以讓最後一行表達式成為回傳值。
用途
避免重複程式碼,讓程式結構更清楚。
Perl 最具代表性的功能之一
如果你學 Perl,只會基本語法還不夠;正規表達式才是 Perl 真正的戰力來源。它可以用來搜尋、驗證、取代、分割文字。
| 語法 | 功能 | 範例 |
|---|---|---|
/word/ |
搜尋字串是否包含某文字 | "Hello" =~ /ell/ |
\d |
數字字元 | /\d+/ |
\s |
空白字元 | /\s+/ |
\w |
英數與底線 | /\w+/ |
^ / $ |
字串開頭 / 結尾 | /^\d+$/ |
() |
分組與擷取 | /(\d\d):(\d\d)/ |
s/// |
搜尋並取代 | $x =~ s/cat/dog/; |
split |
依規則切割字串 | split /,/, $line |
my $text = "My phone is 0912-345-678";
if ($text =~ /\d{4}-\d{3}-\d{3}/) {
print "找到電話格式\n";
}
my $time = "現在時間是 12:34:56";
if ($time =~ /(\d\d):(\d\d):(\d\d)/) {
my ($hour, $min, $sec) = ($1, $2, $3);
print "時:$hour 分:$min 秒:$sec\n";
}
my $x = "I like cat";
$x =~ s/cat/dog/;
print "$x\n"; # I like dog
my $csv = "Amy,18,CS";
my @fields = split /,/, $csv;
print $fields[0], "\n";
讀檔、寫檔、附加內容
現代 Perl 建議使用三參數 `open`,可讀性更高,也比較安全。文字檔建議明確指定編碼,例如 UTF-8。
讀取檔案
使用 `<` 模式開啟文字檔,逐行讀取最常見。
覆寫寫入
使用 `>` 模式,原有內容會被清空後重新寫入。
附加寫入
使用 `>>` 模式,會把新內容接在檔案後面。
use strict;
use warnings;
my $file = "data.txt";
open(my $fh, "<:encoding(UTF-8)", $file)
or die "無法開啟檔案:$!";
while (my $line = <$fh>) {
chomp $line;
print "讀到:$line\n";
}
close $fh;
my $file = "output.txt";
open(my $fh, ">:encoding(UTF-8)", $file)
or die "無法寫入檔案:$!";
print $fh "Perl 檔案寫入成功!\n";
close $fh;
my $file = "log.txt";
open(my $fh, ">>:encoding(UTF-8)", $file)
or die "無法附加寫入:$!";
print $fh "新增一行紀錄\n";
close $fh;
Perl 也能寫 OOP
在 Perl 中,任何 package 都可以扮演 class。常見做法是用 hash 來儲存物件資料,再以 `bless` 讓它成為一個物件。
package Animal;
use strict;
use warnings;
sub new {
my ($class, $name) = @_;
my $self = {
name => $name
};
bless $self, $class;
return $self;
}
sub speak {
my ($self) = @_;
print $self->{name} . " 說:Hello!\n";
}
package main;
my $cat = Animal->new("小白");
$cat->speak();
Class 類別
定義一群物件共有的行為與結構。
Object 物件
從類別建立出來的實體,擁有資料與方法。
Method 方法
其實就是子程序,只是透過物件呼叫,例如 `$obj->run()`。
把語法真正用在實務上
下面提供三個常見的 Perl 應用範例:文字統計、簡易日誌分析、CSV 解析。這些都是 Perl 很典型的用途。
範例一:統計文字檔中有多少行
use strict;
use warnings;
my $file = "article.txt";
open(my $fh, "<:encoding(UTF-8)", $file) or die "無法開啟:$!";
my $count = 0;
while (<$fh>) {
$count++;
}
close $fh;
print "總行數:$count\n";
範例二:分析日誌中 ERROR 的數量
use strict;
use warnings;
my $file = "server.log";
open(my $fh, "<:encoding(UTF-8)", $file) or die "無法開啟:$!";
my $error_count = 0;
while (my $line = <$fh>) {
$error_count++ if $line =~ /ERROR/;
}
close $fh;
print "ERROR 次數:$error_count\n";
範例三:解析簡單 CSV 資料
use strict;
use warnings;
my $line = "Amy,18,Computer Science";
my @fields = split /,/, $line;
print "姓名:$fields[0]\n";
print "年齡:$fields[1]\n";
print "科系:$fields[2]\n";
測試你是否真的學會了
做完下面 8 題,你就能快速檢查自己對 Perl 基礎是否有掌握。按下「提交答案」後會自動計分。
官方文件與延伸學習
如果你打算繼續深入學習,下面這些官方資源非常值得收藏。這份網站內容也主要根據這些文件整理。
perlsyn
Perl 基本語法、敘述規則與流程控制。
perldata
Scalar、Array、Hash 與 Sigil 的核心說明。
perlsub
子程序定義、呼叫方式與參數傳遞。
perlretut
正規表達式教學文件,適合初學者。
perlrequick
Regex 快速入門版,適合複習與速查。
perlopentut
現代 Perl 檔案開啟與讀寫教學。
perlootut
Perl 物件導向教學入門。
Learn Perl 文件入口
Perl.org 的學習資源總覽頁。