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}; # 箭头运算符运算符优先级
优先级从高到低
- 术语和列表操作符(左)
->++--(自增/自减)**(幂)!~\+-(逻辑非、位非、引用、正负号)=~!~(匹配)*/%x(乘、除、取模、重复)+-.(加、减、连接)<<>>(位移)- 命名单目运算符
<<=>>=ltlegtge(比较)==!=<=>eqnecmp(相等比较)&(位与)|^(位或、异或)&&(逻辑与)||//(逻辑或、定义-or).....(范围)?:(三元运算符)=+=-=*=等(赋值),=>(逗号、胖箭头)- 逻辑操作符(右)
andorxor(低优先级逻辑)
使用括号明确优先级
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 的运算符:
- ✅ 算术运算符
- ✅ 字符串运算符
- ✅ 比较运算符
- ✅ 逻辑运算符
- ✅ 位运算符
- ✅ 赋值运算符
- ✅ 文件测试运算符
- ✅ 正则表达式运算符
- ✅ 运算符优先级
接下来,我们将学习 Perl 条件语句。