Perl 中比较运算符与其他语言中相比更容易出错,数值类型判断与字符类型判断的运算符可以进行混用而且不会出异常,这往往会导致程序出现不易修复的错误
两种比较运算符
字符判断
设置变量 $a = "abc", $b = "xyz"
运算符 | 描述 | 实例 |
---|---|---|
eq | 检查左边的字符串是否等于右边的字符串,如果是返回 true,否则返回 false | ($a eq $b) 返回 false |
ne | 检查左边的字符串是否不等于右边的字符串,如果是返回 true,否则返回 false | ($a ne $b) 返回 true |
cmp | 如果左边的字符串大于右边的字符串返回 1,如果相等返回 0,如果左边的字符串小于右边的字符串返回 -1 | ($a cmp $b) 返回 -1 |
gt | 检查左边的字符串是否大于右边的字符串,如果是返回 true,否则返回 false | ($a gt $b) 返回 false |
lt | 检查左边的字符串是否小于右边的字符串,如果是返回 true,否则返回 false | ($a lt $b) 返回 true |
ge | 检查左边的字符串是否大于或等于右边的字符串,如果是返回 true,否则返回 false | ($a ge $b) 返回 false |
le | 检查左边的字符串是否小于或等于右边的字符串,如果是返回 true,否则返回 false | ($a le $b) 返回 true |
程序示例:
$a = "abc";
$b = "xyz";
$a eq $b 返回 false
$a ne $b 返回 true
$a cmp $b 返回 -1
$a gt $b 返回 false
$a lt $b 返回 true
$a ge $b 返回 false
$a le $b 返回 true
数值判断
设置变量 $a = 10, $b = 20
运算符 | 描述 | 实例 |
---|---|---|
== | 检查两个操作数的值是否相等,如果相等则条件为 true,否则为 false | ($a == $b) 为 false |
!= | 检查两个操作数的值是否相等,如果不相等则条件为 true,否则为 false | ($a != $b) 为 true |
<=> | 检查两个操作数的值是否相等, 如果左边的数小于右边的数返回 -1,如果相等返回 0, 如果左边的数大于右边的数返回 1 | ($a <=> $b) 返回 -1 |
> | 检查左操作数的值是否大于右操作数的值,如果是则条件为 true,否则为 false | ($a > $b) 返回 false |
< | 检查左操作数的值是否小于右操作数的值,如果是则条件为 true,否则返回 false | ($a < $b) 返回 true |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为 true,否则返回 false | ($a >= $b) 返回 false |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为 true,否则返回 false | ($a <= $b) 返回 true |
程序示例:
$a = 10;
$b = 20;
$a == $b 返回 false
$a != $b 返回 true
$a <=> $b 返回 -1
$a > $b 返回 false
$a < $b 返回 true
$a >= $b 返回 false
$a <= $b 返回 true
如果用错会发生什么?
直接上测试数据:
$a=abc, $b=xyz
$a == $b 返回值:1 布尔值: true
$a != $b 返回值: 布尔值: false
$a <=> $b 返回值:0 布尔值: false
$a > $b 返回值: 布尔值: false
$a < $b 返回值: 布尔值: false
$a >= $b 返回值:1 布尔值: true
$a <= $b 返回值:1 布尔值: true
$a eq $b 返回值: 布尔值: false
$a ne $b 返回值:1 布尔值: true
$a cmp $b 返回值:-1 布尔值: true
$a gt $b 返回值: 布尔值: false
$a lt $b 返回值:1 布尔值: true
$a ge $b 返回值: 布尔值: false
$a le $b 返回值:1 布尔值: true
$a=123, $b=45
$a eq $b 返回值: 布尔值: false
$a ne $b 返回值:1 布尔值: true
$a cmp $b 返回值:-1 布尔值: true
$a gt $b 返回值: 布尔值: false
$a lt $b 返回值:1 布尔值: true
$a ge $b 返回值: 布尔值: false
$a le $b 返回值:1 布尔值: true
$a=123, $b=456
$a eq $b 返回值: 布尔值: false
$a ne $b 返回值:1 布尔值: true
$a cmp $b 返回值:-1 布尔值: true
$a gt $b 返回值: 布尔值: false
$a lt $b 返回值:1 布尔值: true
$a ge $b 返回值: 布尔值: false
$a le $b 返回值:1 布尔值: true
$res of $a ne $b length:0
由测试结果可知:
-
==, !=
数字型比较运算符对所有字符类型的判断均为真,而eq, ne
字符型比较运算符对所有比较内容均当做字符按字典序进行比较,如果用错将导致严重错误,且不易察觉 - 布尔表达式的结果中判断为真时实际返回值为"1", 而结果为假是返回值为"",其长度为零,并不是0, "0" 或false,这与其他主流语言是有很大不同的
- 实际上perl语言中并没有布尔数据类型,而是标量、数组、哈希三种标准数据类型,需要特别注意
总结
在perl的条件语句中使用比较运算符时需要区分比较内容是数字型还是字符型,选择正确的比较运算符
错误样例代码
boolean_expression.pl
#!/bin/perl
###################
#2019/04/10
#by dongye
###################
$a = "abc";
$b = "xyz";
sub expression{
my $res = shift;
my $exp = shift;
print "\$a $exp \$b \t返回值:$res\t布尔值: ";
if ($res){
print "true\n";
}
else{
print "false\n";
}
}
print "\$a=$a, \$b=$b\n";
&expression($a == $b, "==");
&expression($a != $b, "!=");
&expression($a <=> $b, "<=>");
&expression($a > $b, ">");
&expression($a < $b, "<");
&expression($a >= $b, ">=");
&expression($a <= $b, "<=");
&expression($a eq $b, "eq");
&expression($a ne $b, "ne");
&expression($a cmp $b, "cmp");
&expression($a gt $b, "gt");
&expression($a lt $b, "lt");
&expression($a ge $b, "ge");
&expression($a le $b, "le");
$a = 123;
$b = 45;
print "\$a=$a, \$b=$b\n";
&expression($a eq $b, "eq");
&expression($a ne $b, "ne");
&expression($a cmp $b, "cmp");
&expression($a gt $b, "gt");
&expression($a lt $b, "lt");
&expression($a ge $b, "ge");
&expression($a le $b, "le");
$a = 123;
$b = 456;
print "\$a=$a, \$b=$b\n";
&expression($a eq $b, "eq");
&expression($a ne $b, "ne");
&expression($a cmp $b, "cmp");
&expression($a gt $b, "gt");
&expression($a lt $b, "lt");
&expression($a ge $b, "ge");
&expression($a le $b, "le");
$res = ($a eq $b);
print "\$res of \$a ne \$b length:".length($res)."\n";
网友评论