Perl 比较运算符

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 字符型比较运算符对所有比较内容均当做字符按字典序进行比较,如果用错将导致严重错误,且不易察觉
  • 布尔表达式的结果中判断为真时实际返回值为"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");