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";
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,132评论 6 523
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,457评论 3 404
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,411评论 0 368
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,147评论 1 301
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,145评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,611评论 1 315
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,962评论 3 429
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,948评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,479评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,514评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,640评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,228评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,973评论 3 340
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,402评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,551评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,210评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,714评论 2 366

推荐阅读更多精彩内容

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