深入 Perl:控制结构与正则表达式
本章将深入探讨 Perl 的控制结构和正则表达式,这些功能使得 Perl 成为处理文本和数据的强大工具。
1. 控制结构
1.1 条件语句
if
语句
if
语句用于根据条件执行代码块。它的基本形式如下:
if (condition) {
# 条件为真时执行的代码
}
示例:
my $age = 20;
if ($age >= 18) {
print "You are an adult.\n";
} else {
print "You are a minor.\n";
}
unless
语句
unless
语句与 if
相反,当条件为假时执行代码块。它的基本形式如下:
unless (condition) {
# 条件为假时执行的代码
}
示例:
my $status = "offline";
unless ($status eq "online") {
print "The user is not online.\n";
}
elsif
语句
elsif
语句用于在 if
语句之后添加额外的条件检查。
my $score = 85;
if ($score >= 90) {
print "Grade: A\n";
} elsif ($score >= 80) {
print "Grade: B\n";
} else {
print "Grade: C\n";
}
given-when
语句
given-when
语句类似于其他语言的 switch-case
语句。它用于多重条件检查。
use v5.10;
my $fruit = "apple";
given ($fruit) {
when ("apple") {
print "This is an apple.\n";
}
when ("banana") {
print "This is a banana.\n";
}
default {
print "Unknown fruit.\n";
}
}
1.2 循环语句
while
循环
while
循环在条件为真时反复执行代码块。
my $count = 1;
while ($count <= 5) {
print "Count is $count\n";
$count++;
}
for
循环
for
循环用于固定次数的迭代,形式类似于 C 语言的 for
循环。
for (my $i = 0; $i < 5; $i++) {
print "Iteration $i\n";
}
foreach
循环
foreach
循环用于遍历数组或列表中的每个元素。
my @colors = ("red", "green", "blue");
foreach my $color (@colors) {
print "Color: $color\n";
}
do-while
和 do-until
循环
do-while
和 do-until
循环先执行代码块,然后再检查条件。
my $num = 1;
do {
print "Number: $num\n";
$num++;
} while ($num <= 5);
do-until
与 do-while
类似,只是条件相反。
my $num = 1;
do {
print "Number: $num\n";
$num++;
} until ($num > 5);
1.3 子程序和函数
子程序(subroutine)是可以重复使用的代码块。使用 sub
关键字定义。
sub greet {
my ($name) = @_;
print "Hello, $name!\n";
}
greet("Alice");
greet("Bob");
子程序可以返回值:
sub add {
my ($a, $b) = @_;
return $a + $b;
}
my $sum = add(10, 20);
print "Sum: $sum\n";
2. 正则表达式
正则表达式是 Perl 的强项之一,用于模式匹配和文本处理。
2.1 基本语法
正则表达式使用 //
表示匹配模式。
my $text = "Hello, World!";
if ($text =~ /World/) {
print "Match found!\n";
}
2.2 元字符
正则表达式中的元字符有特殊意义:
.
匹配任意单个字符^
匹配字符串的开头$
匹配字符串的结尾*
匹配前一个字符 0 次或多次+
匹配前一个字符 1 次或多次?
匹配前一个字符 0 次或 1 次\d
匹配任何数字\w
匹配任何单词字符(字母、数字、下划线)\s
匹配任何空白字符
示例:
my $text = "The quick brown fox jumps over the lazy dog.";
if ($text =~ /quick/) {
print "Found 'quick'.\n";
}
if ($text =~ /^\w+/) {
print "Starts with a word.\n";
}
if ($text =~ /\d+/) {
print "Contains a number.\n";
} else {
print "No number found.\n";
}
2.3 字符类与量词
字符类用方括号 []
表示,可以匹配括号内的任意字符。
my $data = "abc123";
if ($data =~ /[a-z]/) {
print "Contains a lowercase letter.\n";
}
if ($data =~ /[0-9]/) {
print "Contains a digit.\n";
}
量词用于指定匹配次数:
{n}
精确匹配 n 次{n,}
至少匹配 n 次{n,m}
匹配 n 到 m 次
示例:
my $numbers = "12345";
if ($numbers =~ /\d{5}/) {
print "Contains exactly 5 digits.\n";
}
if ($numbers =~ /\d{3,}/) {
print "Contains at least 3 digits.\n";
}
if ($numbers =~ /\d{2,4}/) {
print "Contains 2 to 4 digits.\n";
}
2.4 捕获组与替换
捕获组用圆括号 ()
表示,可以提取匹配的子字符串。
my $date = "2024-06-30";
if ($date =~ /(\d{4})-(\d{2})-(\d{2})/) {
print "Year: $1, Month: $2, Day: $3\n";
}
替换操作使用 s///
语法。
my $text = "The color is red.";
$text =~ s/red/blue/;
print "$text\n"; # 输出 "The color is blue."
2.5 高级正则表达式
非捕获组
非捕获组用 (?: )
表示,用于匹配但不捕获。
my $str = "abc123";
if ($str =~ /(?:abc)(\d+)/) {
print "Digits: $1\n"; # 只捕获数字部分
}
断言
正则表达式支持正向和反向断言:
(?=...)
正向肯定断言(?!...)
正向否定断言(?<=...)
反向肯定断言(?<!...)
反向否定断言
示例:
my $text = "foo123bar";
if ($text =~ /foo(?=\d+)/) {
print "Found 'foo' followed by digits.\n";
}
if ($text =~ /(?<=\d{3})bar/) {
print "Found 'bar' preceded by three digits.\n";
}
结论
通过本文,我们深入了解了 Perl 中的重要控制结构和正则表达式。你学习了条件语句、循环语句以及如何定义和使用子程序,并掌握了 Perl 强大的正则表达式语法和应用。希望这些内容能帮助你在实际编程中更高效地处理复杂的逻辑和文本数据。接下来,可以继续探索 Perl 的高级功能和应用。