Perl 比较运算符

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

由测试结果可知:

  1. ==, != 数字型比较运算符对所有字符类型的判断均为真,而 eq, ne 字符型比较运算符对所有比较内容均当做字符按字典序进行比较,如果用错将导致严重错误,且不易察觉
  2. 布尔表达式的结果中判断为真时实际返回值为"1", 而结果为假是返回值为"",其长度为零,并不是0, "0" 或false,这与其他主流语言是有很大不同的
  3. 实际上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";
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 运算符是处理数据的基本方法,用来从现有的值得到新的值。JavaScript 提供了多种运算符,本章逐一介绍这些运算...
    徵羽kid阅读 4,005评论 0 0
  • 算术运算符 JavaScript 共提供10个算术运算符,用来完成基本的算术运算。 加法运算符:x + y 减法运...
    guyigg阅读 5,066评论 0 1
  • 前言: 最近在学习javascript中数据类型、运算符,以及运算符优先级等相关基础知识,相对简单、基础但也很重要...
    饥人谷_远方阅读 4,164评论 0 3
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 10,966评论 0 9
  • 一. Android分发机制概述:Android如此受欢迎,就在于其优秀的交互性,这其中,Android优秀的事件...
    shixinBook阅读 2,962评论 0 1

友情链接更多精彩内容