Skip to content

Perl 运算符

算术运算符

基本算术运算符

perl
my $a = 10;
my $b = 3;

print $a + $b;   # 加法:13
print $a - $b;   # 减法:7
print $a * $b;   # 乘法:30
print $a / $b;   # 除法:3.33333333333333
print $a % $b;   # 取模:1
print $a ** $b;  # 幂运算:1000

算术赋值运算符

perl
my $num = 10;

$num += 5;   # $num = $num + 5   结果:15
$num -= 3;   # $num = $num - 3   结果:12
$num *= 2;   # $num = $num * 2   结果:24
$num /= 4;   # $num = $num / 4   结果:6
$num %= 4;   # $num = $num % 4   结果:2
$num **= 3;  # $num = $num ** 3  结果:8

自增和自减

perl
my $num = 5;

$num++;      # 自增:6
$num--;      # 自减:5

# 前缀和后缀的区别
my $a = 5;
my $b = ++$a;  # 先自增再赋值:$a=6, $b=6

my $c = 5;
my $d = $c++;  # 先赋值再自增:$c=6, $d=5

字符串运算符

字符串连接

perl
my $str1 = "Hello";
my $str2 = "World";
my $combined = $str1 . " " . $str2;  # "Hello World"

字符串重复

perl
my $line = "-" x 20;  # "--------------------"
my $beep = "a" x 5;   # "aaaaa"

字符串比较运算符

perl
my $str1 = "apple";
my $str2 = "banana";

print $str1 eq $str2;  # 等于:0(假)
print $str1 ne $str2;  # 不等于:1(真)
print $str1 lt $str2;  # 小于:1(真)
print $str1 gt $str2;  # 大于:0(假)
print $str1 le $str2;  # 小于等于:1(真)
print $str1 ge $str2;  # 大于等于:0(假)

# 使用 cmp 比较返回 -1, 0, 或 1
print $str1 cmp $str2;  # -1(小于)

比较运算符

数值比较

perl
my $a = 10;
my $b = 20;

print $a == $b;   # 等于:0(假)
print $a != $b;   # 不等于:1(真)
print $a < $b;    # 小于:1(真)
print $a > $b;    # 大于:0(假)
print $a <= $b;   # 小于等于:1(真)
print $a >= $b;   # 大于等于:0(假)

# 使用 <=> 比较返回 -1, 0, 或 1
print $a <=> $b;   # -1(小于)

比较运算符总结

数值字符串说明
==eq等于
!=ne不等于
<lt小于
>gt大于
<=le小于等于
>=ge大于等于
<=>cmp比较返回 -1/0/1

逻辑运算符

基本逻辑运算符

perl
my $a = 1;
my $b = 0;

print $a && $b;   # 逻辑与:0
print $a \|\| $b;  # 逻辑或:1
print !$a;         # 逻辑非:0

低优先级逻辑运算符

perl
my $a = 1;
my $b = 0;

print $a and $b;   # 逻辑与:0
print $a or $b;    # 逻辑或:1
print not $a;      # 逻辑非:0

三元运算符

perl
my $age = 18;
my $status = $age >= 18 ? "adult" : "minor";
print $status;  # "adult"

短路求值

perl
# 逻辑与:如果第一个为假,不计算第二个
my $x = 0;
my $y = 10;
my $result = $x && ($y = 20);  # $y 不会被修改

# 逻辑或:如果第一个为真,不计算第二个
my $a = 1;
my $b = 10;
my $result2 = $a || ($b = 20);  # $b 不会被修改

# 定义-or 运算符
my $value = $input // "default";

位运算符

perl
my $a = 5;   # 二进制:101
my $b = 3;   # 二进制:011

print $a & $b;   # 按位与:1(001)
print $a \| $b;  # 按位或:7(111)
print $a ^ $b;   # 按位异或:6(110)
print ~$a;        # 按位非:-6
print $a << 1;    # 左移:10(1010)
print $a >> 1;    # 右移:2(010)

赋值运算符

perl
my $a = 10;      # 赋值

my $b = $a;      # 复制
$a = $b = 5;     # 链式赋值

# 多值赋值
my ($x, $y, $z) = (1, 2, 3);

逗号运算符

perl
# 标量上下文中返回最后一个值
my $result = (1, 2, 3);  # $result = 3

# 列表上下文中返回整个列表
my @array = (1, 2, 3);   # @array = (1, 2, 3)

# 在 for 循环中使用
for (my $i = 0, my $j = 10; $i < 10; $i++, $j--) {
    print "$i, $j\n";
}

范围运算符

perl
# 数字范围
my @nums = 1..10;  # (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

# 字符范围
my @chars = 'a'..'z';  # ('a', 'b', ..., 'z')

# 条件范围
while (<>) {
    print if /start/../end/;  # 打印从 /start/ 到 /end/ 之间的行
}

字符串运算符(高级)

字符串连接和赋值

perl
my $str = "Hello";
$str .= " World";  # $str = "Hello World"

字符串比较(智能匹配)

perl
use v5.10;

my $name = "Alice";

if ($name ~~ qr/^A/) {
    print "Starts with A\n";
}

文件测试运算符

perl
my $file = "test.txt";

print -e $file;   # 文件是否存在
print -f $file;   # 是否是普通文件
print -d $file;   # 是否是目录
print -r $file;   # 是否可读
print -w $file;   # 是否可写
print -x $file;   # 是否可执行
print -s $file;   # 文件大小(字节)
print -z $file;   # 文件是否为空

正则表达式运算符

perl
my $text = "Hello World";

# 匹配
if ($text =~ /World/) {
    print "Found!\n";
}

# 不匹配
if ($text !~ /Python/) {
    print "Not found!\n";
}

# 替换
$text =~ s/World/Perl/;  # "Hello Perl"

# 全局替换
$text =~ s/l/x/g;  # "Hexxo Perx"

引用运算符

perl
# 反斜杠创建引用
my $scalar = 42;
my $scalar_ref = \$scalar;

my @array = (1, 2, 3);
my $array_ref = \@array;

my %hash = (key => "value");
my $hash_ref = \%hash;

# 方括号创建匿名数组
my $anon_array = [1, 2, 3];

# 花括号创建匿名哈希
my $anon_hash = {name => "Alice"};

解引用运算符

perl
my $array_ref = [1, 2, 3];
my @array = @$array_ref;     # 解引用为数组
my $first = $array_ref->[0];  # 箭头运算符

my $hash_ref = {name => "Alice"};
my %hash = %$hash_ref;       # 解引用为哈希
my $name = $hash_ref->{name}; # 箭头运算符

运算符优先级

优先级从高到低

  1. 术语和列表操作符(左)
  2. ->
  3. ++ --(自增/自减)
  4. **(幂)
  5. ! ~ \ + -(逻辑非、位非、引用、正负号)
  6. =~ !~(匹配)
  7. * / % x(乘、除、取模、重复)
  8. + - .(加、减、连接)
  9. << >>(位移)
  10. 命名单目运算符
  11. < <= > >= lt le gt ge(比较)
  12. == != <=> eq ne cmp(相等比较)
  13. &(位与)
  14. | ^(位或、异或)
  15. &&(逻辑与)
  16. || //(逻辑或、定义-or)
  17. .. ...(范围)
  18. ?:(三元运算符)
  19. = += -= *= 等(赋值)
  20. , =>(逗号、胖箭头)
  21. 逻辑操作符(右)
  22. and or xor(低优先级逻辑)

使用括号明确优先级

perl
# 不清楚优先级时使用括号
my $result = ($a + $b) * $c;
my $condition = ($x > 0) and ($y < 10);

实践示例

示例 1:计算器

perl
#!/usr/bin/perl
use strict;
use warnings;

print "请输入第一个数字: ";
chomp(my $num1 = <STDIN>);

print "请输入第二个数字: ";
chomp(my $num2 = <STDIN>);

printf "加法: %d + %d = %d\n", $num1, $num2, $num1 + $num2;
printf "减法: %d - %d = %d\n", $num1, $num2, $num1 - $num2;
printf "乘法: %d * %d = %d\n", $num1, $num2, $num1 * $num2;
printf "除法: %d / %d = %.2f\n", $num1, $num2, $num1 / $num2;
printf "取模: %d %% %d = %d\n", $num1, $num2, $num1 % $num2;
printf "幂: %d ** %d = %d\n", $num1, $num2, $num1 ** $num2;

示例 2:字符串操作

perl
#!/usr/bin/perl
use strict;
use warnings;

my $str1 = "Hello";
my $str2 = "World";

my $combined = $str1 . " " . $str2;
print "连接: $combined\n";

my $repeated = $str1 x 3;
print "重复: $repeated\n";

print "长度: " . length($combined) . "\n";

if ($str1 lt $str2) {
    print "'$str1' 在字典序中位于 '$str2' 之前\n";
}

示例 3:逻辑判断

perl
#!/usr/bin/perl
use strict;
use warnings;

my $age = 25;
my $has_license = 1;
my $has_car = 0;

my $can_drive = $age >= 18 && $has_license;
print "可以开车: " . ($can_drive ? "是" : "否") . "\n";

my $can_travel = $has_license || $has_car;
print "可以旅行: " . ($can_travel ? "是" : "否") . "\n";

my $status = $age >= 18 ? "成年" : "未成年";
print "状态: $status\n";

小结

本章节学习了 Perl 的运算符:

  1. ✅ 算术运算符
  2. ✅ 字符串运算符
  3. ✅ 比较运算符
  4. ✅ 逻辑运算符
  5. ✅ 位运算符
  6. ✅ 赋值运算符
  7. ✅ 文件测试运算符
  8. ✅ 正则表达式运算符
  9. ✅ 运算符优先级

接下来,我们将学习 Perl 条件语句