Perl 中比较运算符与其他语言中相比更容易出错,数值类型判断与字符类型判断的运算符可以进行混用而且不会出异常,这往往会导致程序出现不易修复的错误
两种比较运算符
设置变量 $a = "abc", $b = "xyz"
$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
字符型比较运算符对所有比较内容均当做字符按字典序进行比较,如果用错将导致严重错误,且不易察觉
在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");