比较运算符 #

一、数字比较运算符 #

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