Perl 简明教程
一、Perl 简介
Perl(Practical Extraction and Report Language)是一种功能强大的脚本语言,特别擅长文本处理,广泛应用于系统管理、Web开发、网络编程等领域。
二、快速开始
1. 第一个 Perl 程序
#!/usr/bin/perl
use strict;
use warnings;
print "Hello, World!\n";
2. 运行 Perl 程序
# 方法1:直接运行
perl script.pl
# 方法2:添加执行权限
chmod +x script.pl
./script.pl
三、基础语法
1. 变量
# 标量(单个值)
my $scalar = "字符串";
my $number = 42;
my $float = 3.14;
# 数组(列表)
my @array = (1, 2, 3, "four");
my $first = $array[0]; # 访问元素
my $size = @array; # 数组长度
# 哈希(键值对)
my %hash = (
"name" => "Alice",
"age" => 30,
);
my $name = $hash{"name"};
2. 控制结构
# 条件语句
if ($score >= 90) {
print "优秀\n";
} elsif ($score >= 60) {
print "及格\n";
} else {
print "不及格\n";
}
# 循环
# for 循环
for my $i (0..9) {
print "$i ";
}
# foreach 循环
foreach my $item (@array) {
print "$item\n";
}
# while 循环
my $count = 0;
while ($count < 5) {
print $count++;
}
# until 循环
until ($count >= 10) {
print $count++;
}
四、字符串处理
1. 字符串操作
my $str = "Hello Perl";
# 连接
my $new_str = $str . " World";
# 重复
my $repeat = "a" x 3; # "aaa"
# 长度
my $length = length($str);
# 子字符串
my $sub = substr($str, 0, 5); # "Hello"
# 查找替换
$str =~ s/Perl/World/; # 替换第一个
$str =~ s/Perl/World/g; # 替换所有
# 匹配
if ($str =~ /Hello/) {
print "找到 Hello\n";
}
# 提取匹配
my $text = "价格: $100";
if ($text =~ /\$(\d+)/) {
print "价格是: $1\n"; # $1 保存匹配的内容
}
五、正则表达式
Perl 的正则表达式非常强大:
# 基本匹配
if ($string =~ /pattern/) { ... }
# 修饰符
$string =~ /pattern/i; # 忽略大小写
$string =~ /pattern/g; # 全局匹配
$string =~ /pattern/s; # 让 . 匹配换行符
$string =~ /pattern/m; # 多行模式
# 常用元字符
# . 任意单个字符(除换行)
# \d 数字 [0-9]
# \w 单词字符 [a-zA-Z0-9_]
# \s 空白字符
# ^ 行首
# $ 行尾
# [] 字符类
# | 或
# 量词
# * 0次或多次
# + 1次或多次
# ? 0次或1次
# {n} 恰好n次
# {n,} 至少n次
# {n,m} n到m次
# 示例
my $email = "test@example.com";
if ($email =~ /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/) {
print "有效的邮箱地址\n";
}
六、文件操作
1. 文件读写
# 读取文件
open(my $fh, '<', "input.txt") or die "无法打开文件: $!";
while (my $line = <$fh>) {
chomp($line); # 去掉换行符
print "$line\n";
}
close($fh);
# 写入文件
open(my $fh_out, '>', "output.txt") or die "无法创建文件: $!";
print $fh_out "这是第一行\n";
print $fh_out "这是第二行\n";
close($fh_out);
# 追加文件
open(my $fh_append, '>>', "log.txt") or die "无法打开日志文件: $!";
print $fh_append scalar(localtime) . " 日志记录\n";
close($fh_append);
2. 文件测试
if (-e $filename) { print "文件存在\n"; }
if (-f $filename) { print "是普通文件\n"; }
if (-d $dirname) { print "是目录\n"; }
if (-r $filename) { print "可读\n"; }
if (-w $filename) { print "可写\n"; }
if (-x $filename) { print "可执行\n"; }
if (-z $filename) { print "文件为空\n"; }
if (-s $filename) { print "文件大小: " . (-s $filename) . " 字节\n"; }
七、函数(子程序)
# 定义函数
sub greet {
my ($name) = @_; # 获取参数
return "Hello, $name!";
}
# 调用函数
my $message = greet("Alice");
print "$message\n";
# 多个参数
sub add {
my ($a, $b) = @_;
return $a + $b;
}
# 默认参数
sub power {
my ($base, $exp) = @_;
$exp ||= 2; # 默认指数为2
return $base ** $exp;
}
八、模块和包
1. 使用模块
use strict; # 严格模式
use warnings; # 警告
use diagnostics; # 详细诊断信息
# 常用核心模块
use File::Copy; # 文件操作
use Getopt::Long; # 命令行选项解析
use Time::Local; # 时间处理
use Data::Dumper; # 数据结构调试
2. 创建模块
# MyModule.pm
package MyModule;
use strict;
use warnings;
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
return $self;
}
sub say_hello {
print "Hello from MyModule!\n";
}
1; # 模块必须返回真值
# 使用模块
use lib '.'; # 添加当前目录到模块搜索路径
use MyModule;
my $obj = MyModule->new();
$obj->say_hello();
九、实用示例
1. 命令行参数处理
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
my ($help, $file, $verbose);
GetOptions(
'help|h' => \$help,
'file|f=s' => \$file,
'verbose|v' => \$verbose,
) or die "参数错误\n";
if ($help) {
print "用法: $0 [选项]\n";
print "选项:\n";
print " -h, --help 显示帮助信息\n";
print " -f, --file FILE 指定文件\n";
print " -v, --verbose 详细输出\n";
exit 0;
}
2. 文本处理示例
#!/usr/bin/perl
use strict;
use warnings;
# 统计文件中单词频率
my %word_count;
while (<>) {
chomp;
my @words = split /\s+/, $_;
foreach my $word (@words) {
$word =~ s/[[:punct:]]//g; # 去掉标点
$word = lc($word); # 转为小写
$word_count{$word}++ if $word;
}
}
# 按频率排序输出
foreach my $word (sort { $word_count{$b} <=> $word_count{$a} } keys %word_count) {
printf "%-20s %d\n", $word, $word_count{$word};
}
十、CPAN(Perl 综合典藏网)
CPAN 是 Perl 模块的宝库,包含数千个模块:
# 安装 CPAN 模块
cpan Module::Name
# 使用 cpanm(推荐)
cpanm Module::Name
# 常用模块
# Mojolicious - Web 框架
# DBI - 数据库接口
# JSON - JSON 处理
# LWP::Simple - 网页抓取
# Try::Tiny - 异常处理
十一、最佳实践
总是使用严格模式
use strict;
use warnings;
使用词法变量
my $variable; # 正确
# $variable # 错误(未声明)
检查文件操作
open(my $fh, '<', $file) or die "无法打开 $file: $!";
使用现代 Perl
# 使用 say 自动添加换行
use feature 'say';
say "Hello World";
# 使用 state 变量
use feature 'state';
sub counter {
state $count = 0;
return ++$count;
}
代码格式化
# 使用 perltidy 格式化代码
# perltidy script.pl
十二、学习资源
1. 官方资源
2. 在线教程
- Learn Perl in about 2 hours 30 minutes
- Perl 教程 | 菜鸟教程
- Perl Maven
3. 书籍
- 《Learning Perl》(小骆驼书)
- 《Intermediate Perl》(羊驼书)
- 《Modern Perl》
4. 实践项目
日志分析工具
文本转换工具
网站爬虫
系统监控脚本
数据清洗工具
这个简明教程涵盖了 Perl 的核心概念。Perl 的哲学是 "There's More Than One Way To Do It"(TMTOWTDI,做事的方法不止一种),这给了程序员很大的灵活性。建议从实际项目入手,边做边学,逐步掌握 Perl 的强大功能。