Perl 是由 Larry Wall 于 1987 年创建的通用脚本语言,被誉为"瑞士军刀"和"文本处理之王"。Perl 的设计哲学是 "多种方式做同一件事"(TMTOWTDI),强调实用性和灵活性。
Perl 的核心定位是 文本处理和系统管理的实用语言。它提供了:
Larry Wall 于 1987 年创建 Perl,最初是为了在 Unix 系统上生成报告(Practical Extraction and Report Language)。Perl 很快成为系统管理员的首选语言。
#!/usr/bin/perl
use strict;
use warnings;
# 变量
my $name = "Perl";
my $age = 30;
my @array = (1, 2, 3);
my %hash = (name => "Alice", age => 30);
# 打印
print "Hello, $name!\n";
print "Array: @array\n";
print "Hash: $hash{name}\n";
# 条件判断
if ($age >= 18) {
print "Adult\n";
} else {
print "Minor\n";
}
# 循环
for my $i (1..10) {
print $i . " ";
}
foreach my $item (@array) {
print $item . " ";
}
while (my ($key, $value) = each %hash) {
print "$key => $value\n";
}
# 正则匹配
my $text = "Hello, World!";
if ($text =~ /World/) {
print "匹配成功\n";
}
# 捕获
if ($text =~ /(Hello), (World)!/) {
print "$1, $2\n"; # Hello, World
}
# 替换
$text =~ s/World/Perl/;
print $text; # Hello, Perl!
# 全局匹配
my $data = "2024-01-15 10:00:00";
my @matches = $data =~ /(\d+)/g;
print "数字: @matches\n"; # 2024 01 15 10 00 00
# 复杂正则(日志解析)
my $log = '127.0.0.1 - - [15/Jan/2024:10:00:00 +0800] "GET / HTTP/1.1" 200 2326';
if ($log =~ /^(\S+) .* \[(.*?)\] "(.*?)" (\d+) (\d+)$/) {
my ($ip, $time, $request, $status, $size) = ($1, $2, $3, $4, $5);
print "IP: $ip\nTime: $time\nRequest: $request\nStatus: $status\nSize: $size\n";
}
# 读取文件
open(my $fh, "<", "file.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 "Hello, Perl!\n";
close($fh_out);
# 追加写入
open(my $fh_append, ">>", "output.txt") or die "无法打开文件: $!";
print $fh_append "追加内容\n";
close($fh_append);
# 读取整个文件
my $content = do { local $/; <$fh> };
# 定义子程序
sub greet {
my ($name) = @_;
return "Hello, $name!";
}
# 调用
my $message = greet("Perl");
print $message . "\n";
# 可变参数
sub sum {
my $total = 0;
foreach my $num (@_) {
$total += $num;
}
return $total;
}
print sum(1, 2, 3, 4, 5) . "\n"; # 15
# 引用传递
sub add_to_array {
my ($ref) = @_;
push @$ref, "new_item";
}
my @arr = ("a", "b");
add_to_array(\@arr);
print join(", ", @arr) . "\n";
# Person.pm
package Person;
sub new {
my ($class, $name, $age) = @_;
my $self = {
name => $name,
age => $age
};
bless $self, $class;
return $self;
}
sub get_name {
my ($self) = @_;
return $self->{name};
}
sub set_age {
my ($self, $age) = @_;
$self->{age} = $age;
}
1;
# 使用
use Person;
my $person = Person->new("Alice", 30);
print $person->get_name() . "\n"; # Alice
$person->set_age(31);
# 安装 CPAN 模块
cpan install Data::Dumper
cpan install JSON
cpan install LWP::UserAgent
# 使用模块
use Data::Dumper;
use JSON;
use LWP::UserAgent;
# 打印数据结构
my $data = {name => "Alice", age => 30};
print Dumper($data);
# JSON 处理
my $json = JSON->new();
my $json_str = $json->encode($data);
print $json_str . "\n";
# HTTP 请求
my $ua = LWP::UserAgent->new;
my $response = $ua->get("https://api.example.com/data");
if ($response->is_success) {
print $response->decoded_content . "\n";
}
| 对比项 | Perl | Python | PHP |
|---|---|---|---|
| 正则表达式 | 极强 | 强 | 强 |
| 文本处理 | 极强 | 强 | 强 |
| 系统管理 | 极强 | 强 | 弱 |
| Web 开发 | 一般 | 强 | 极强 |
| 学习曲线 | 陡峭 | 平缓 | 平缓 |
| 适用场景 | 文本/运维 | 通用开发 | Web 开发 |
Perl 语法、变量、控制结构、文件操作
正则表达式、子程序、引用、模块使用
面向对象、CPAN 开发、调试技巧
日志分析、数据清洗、系统自动化、Web 爬虫
Perl 是脚本语言的老牌劲旅。
它用 强大的正则表达式、灵活的语法、深厚的 CPAN 生态 服务了系统管理员和开发者数十年。虽然现在不是最流行的语言,但 Perl 在文本处理和遗留系统维护中仍然有重要价值。
"Perl 是 Unix 系统管理员的瑞士军刀。" 🔧