比较运算符 #
一、数字比较运算符 #
1.1 基本比较 #
| 运算符 | 说明 | 示例 |
|---|---|---|
| == | 等于 | $a == $b |
| != | 不等于 | $a != $b |
| < | 小于 | $a < $b |
| > | 大于 | $a > $b |
| <= | 小于等于 | $a <= $b |
| >= | 大于等于 | $a >= $b |
| <=> | 太空船运算符 | $a <=> $b |
1.2 使用示例 #
perl
my $a = 10;
my $b = 20;
if ($a == $b) {
print "Equal\n";
}
if ($a != $b) {
print "Not equal\n";
}
if ($a < $b) {
print "$a is less than $b\n";
}
if ($a >= 5) {
print "$a is greater or equal to 5\n";
}
1.3 太空船运算符 <=> #
返回 -1、0、1:
perl
my $result1 = 5 <=> 10;
my $result2 = 10 <=> 10;
my $result3 = 15 <=> 10;
print "$result1, $result2, $result3\n";
用于排序:
perl
my @numbers = (5, 2, 8, 1, 9, 3);
my @sorted = sort { $a <=> $b } @numbers;
print "@sorted\n";
二、字符串比较运算符 #
2.1 基本比较 #
| 运算符 | 说明 | 示例 |
|---|---|---|
| eq | 等于 | $a eq $b |
| ne | 不等于 | $a ne $b |
| lt | 小于 | $a lt $b |
| gt | 大于 | $a gt $b |
| le | 小于等于 | $a le $b |
| ge | 大于等于 | $a ge $b |
| cmp | 比较 | $a cmp $b |
2.2 使用示例 #
perl
my $str1 = "apple";
my $str2 = "banana";
if ($str1 eq $str2) {
print "Equal\n";
}
if ($str1 ne $str2) {
print "Not equal\n";
}
if ($str1 lt $str2) {
print "$str1 comes before $str2\n";
}
2.3 cmp运算符 #
perl
my $result1 = "apple" cmp "banana";
my $result2 = "apple" cmp "apple";
my $result3 = "banana" cmp "apple";
print "$result1, $result2, $result3\n";
用于字符串排序:
perl
my @words = qw(banana Apple cherry);
my @sorted = sort { $a cmp $b } @words;
print "@sorted\n";
my @sorted_ci = sort { lc($a) cmp lc($b) } @words;
print "@sorted_ci\n";
三、数字与字符串比较的区别 #
3.1 重要区别 #
数字比较使用符号,字符串比较使用字母:
| 数字 | 字符串 |
|---|---|
| == | eq |
| != | ne |
| < | lt |
| > | gt |
| <= | le |
| >= | ge |
| <=> | cmp |
3.2 常见错误 #
perl
my $a = "10";
my $b = "2";
if ($a > $b) {
print "Numeric: 10 > 2\n";
}
if ($a gt $b) {
print "String: 10 gt 2\n";
}
3.3 正确选择 #
perl
my $age = "25";
if ($age == 25) {
print "Age is 25\n";
}
my $name = "Tom";
if ($name eq "Tom") {
print "Name is Tom\n";
}
四、智能匹配 ~~ (Perl 5.10+) #
4.1 基本用法 #
perl
use v5.10;
my $value = 42;
if ($value ~~ 42) {
print "Matches 42\n";
}
my @arr = (1, 2, 3, 4, 5);
if ($value ~~ @arr) {
print "Found in array\n";
}
my %hash = (a => 1, b => 2);
if ("a" ~~ %hash) {
print "Key exists\n";
}
4.2 智能匹配规则 #
| 左侧 | 右侧 | 行为 |
|---|---|---|
| 标量 | 标量 | 数值相等或字符串相等 |
| 标量 | 数组 | 数组中是否包含该元素 |
| 标量 | 哈希 | 哈希中是否存在该键 |
| 数组 | 数组 | 数组是否相同 |
| 数组 | 哈希 | 数组元素是否都是哈希的键 |
五、defined和exists #
5.1 defined #
检查变量是否已定义:
perl
my $var;
if (defined $var) {
print "Defined\n";
} else {
print "Undefined\n";
}
$var = "";
if (defined $var) {
print "Defined (empty string)\n";
}
5.2 exists #
检查哈希键是否存在:
perl
my %hash = (a => 1, b => undef);
if (exists $hash{a}) {
print "Key 'a' exists\n";
}
if (exists $hash{b}) {
print "Key 'b' exists\n";
}
if (exists $hash{c}) {
print "Key 'c' exists\n";
} else {
print "Key 'c' does not exist\n";
}
5.3 defined vs exists #
perl
my %hash = (a => undef);
print "exists: ", exists $hash{a} ? "yes" : "no", "\n";
print "defined: ", defined $hash{a} ? "yes" : "no", "\n";
print "true: ", $hash{a} ? "yes" : "no", "\n";
六、实用示例 #
6.1 数值范围检查 #
perl
sub in_range {
my ($value, $min, $max) = @_;
return $value >= $min && $value <= $max;
}
print in_range(5, 1, 10) ? "Yes\n" : "No\n";
print in_range(15, 1, 10) ? "Yes\n" : "No\n";
6.2 字符串模式检查 #
perl
my $input = "Hello123";
if ($input =~ /^\d+$/) {
print "All digits\n";
} elsif ($input =~ /^[a-zA-Z]+$/) {
print "All letters\n";
} else {
print "Mixed content\n";
}
6.3 版本比较 #
perl
use version;
my $v1 = version->parse("1.2.3");
my $v2 = version->parse("1.10.0");
if ($v1 < $v2) {
print "$v1 is older than $v2\n";
}
七、实践练习 #
练习1:成绩等级 #
perl
#!/usr/bin/perl
use strict;
use warnings;
use v5.10;
my $score = 85;
my $grade;
if ($score >= 90) {
$grade = "A";
} elsif ($score >= 80) {
$grade = "B";
} elsif ($score >= 70) {
$grade = "C";
} elsif ($score >= 60) {
$grade = "D";
} else {
$grade = "F";
}
say "Score: $score, Grade: $grade";
练习2:字符串排序 #
perl
#!/usr/bin/perl
use strict;
use warnings;
use v5.10;
my @words = qw(Perl Python Ruby PHP JavaScript);
my @sorted_asc = sort { $a cmp $b } @words;
my @sorted_desc = sort { $b cmp $a } @words;
my @sorted_len = sort { length($a) <=> length($b) } @words;
say "Original: @words";
say "Ascending: @sorted_asc";
say "Descending: @sorted_desc";
say "By length: @sorted_len";
练习3:多条件判断 #
perl
#!/usr/bin/perl
use strict;
use warnings;
use v5.10;
my ($username, $password) = ("admin", "secret");
if ($username eq "admin" && $password eq "secret") {
say "Login successful";
} elsif ($username ne "admin") {
say "Invalid username";
} else {
say "Invalid password";
}
八、总结 #
本章学习了:
- 数字比较运算符
- 字符串比较运算符
- 太空船运算符和cmp运算符
- 数字与字符串比较的区别
- 智能匹配
- defined和exists
下一章将学习逻辑运算符。
最后更新:2026-03-27