加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl的逻辑运算

发布时间:2020-12-16 00:23:35 所属栏目:大数据 来源:网络整理
导读:perl语言与其它语言一样,也有逻辑运算,但是由于perl没有基本变量类型的原因,逻辑运算过程往往会产生一定的隐患。 if($value){} ? ? ? ?这种写法,经常用来判断$value是否已定义,尤其$value作为数组中的值时。在通常的分类中,perl中的变量分为标量、矢量
perl语言与其它语言一样,也有逻辑运算,但是由于perl没有基本变量类型的原因,逻辑运算过程往往会产生一定的隐患。
  1. if($value){}
    ????这种写法,经常用来判断$value是否已定义,尤其$value作为数组中的值时。在通常的分类中,perl中的变量分为标量、矢量和布尔。其中,标量分为列队、数组和散列。标量分为数字、字符串、指针和未定义。这些分类最大的特点就是可以根据当前环境互相转化,完全没有类型约束,这就导致了在布尔环境下,大小为0的矢量、数字0、空字符串、未定义标量全都视为逻辑假,所以上面的if语句中,如果变量已定义但是为数字0或空串时,条件并不成立,如果此句作为全安检查,可以说一个隐患就形成了。
    ????如果要避免的话可以这样:defined $value或$value==0或$value eq '',矢量使用scalar强制转换成标量,不失为一个好习惯。
  2. my @array =?(1,2,3) || die "Failed to get arrayn";
    ????是不是看着眼熟?是的,在其它支持短路表达式的语言中,这是一种简单实用的异常检查的方法。但是在perl里却有了些变化,perl不但支持逻辑,还支持一种逻辑的逻辑,比如:在逻辑中,或运算符为"||",在逻辑的逻辑中,或运算符为"or",它们最大的区别就是在优先级上,or可以用来判断逻辑式之间的逻辑,它们与等号的优先级为:"||" > "=" > "or"。可见,逻辑"||"的优先级高于等号,所以上面的语句的执行顺序就是这样的:(0,1,2)由于处于逻辑标量环境下,被强制转换成标量3(列队的标量值为列队中的元素数量),然后由于或运算是短路运算,后面的die语句不执行,或运算返回3(或运算返回左算子的值,与运算返回右算子的值),数组@array将3作为自已的第一个元素保存。
    ????此语句的本意是定义一个元素为(0,2)的数组,现在却变成了(3),整个过程perl并没有给出任何警告,以致变成了隐患。解决的办法很简单:把"||"换成"or"就可以了

    perl的逻辑运算

  3. my $curLine = "0n";
    next if($curLine eq 0);
    ????这种语句常用来过滤配置文件中只有数字0的行。当然,上面这两句的错误比较明显,我想大家应该都看出来了,因为我把$curLine的值写出来了,这个if一定不成立。但是如果这句出现在一个比较复杂的文件操作程序中,$curLine正好读到了"0n"这一行(perl语言读行时是带着行末的回车的),这个隐患就不那么明显了。
    ????perl语言中,处理比逻辑也有两套运算符:数字比较运算符(常用的有=,>,<等)和字符串比较运算符(常用的有eq,ne等),这两套运算符运用于各自的环境中,尤其是数字与字符串的混合运算中,由于perl解释器分不清数字和字符串,运算符此时就起了决定当前运算环境的作用。
    ????上面的if语句中,用的是字符串等于逻辑运算符(eq),它决定当前环境为字符串运算环境,数字0被强制转换成字符串的"0",比较时判断的是"0n" eq "0",结果当然是返回逻辑非,并没有达到过滤0行的作用。为了解决这个问题,我们必须把运算环境设置为数字运算环境,即使用数字逻辑等运算符"=",在此环境中,字符串中的非数字字符被强制转换成0,"0n"就被转成了数字0,0=0返回逻辑真,自然达到了目的。
  4. 小结 ???perl语言被宠爱的原因之一就是灵活,可以说基本上没有任何的约束。但是灵活有灵活的规则,上面单就逻辑运算方面举了三个例子,都是细小的地方,但是足以形成所谓的bug,perl中其它方面更有类似的地方,可见,perl学会容易,如果想学好,细心+经验,缺一不可。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读