为什么'<'和'lt'运算符在Perl中返回不同的结果?

时间:2009-07-10 13:29:25

标签: perl comparison

我只是在学习Perl的比较运算符。我尝试了以下代码: -

$foo=291;
$bar=30;

if ($foo < $bar) { 
        print "$foo is less than $bar (first)\n"; 
}

if ($foo lt $bar) { 
        print "$foo is less than $bar (second)\n"; 
}

输出 291小于30(秒)。这是否意味着 lt 运算符始终将变量转换为字符串然后进行比较? Perl使 lt 运算符的行为与 < 运算符的不同之处是什么?

谢谢,

5 个答案:

答案 0 :(得分:12)

你的猜测是正确的。像lt这样的字母操作符将变量比较为字符串,而象征性的操作符如&lt;将它们比作数字。您可以阅读perlop man page了解更多详情。

基本原理是Perl中的标量没有输入,所以没有你告诉它Perl不会知道如何比较两个变量。如果它确实猜到了那么它有时会出错,这将导致必须执行' ' + $a < ' ' + $b之类的操作来强制字符串比较,这可能比lt更糟糕。

那说这是一个可怕的陷阱,它可能会抓住Perl的每个新手,并且在使用较少的post-modern language一段时间后回到Perl时仍然会抓住我。

答案 1 :(得分:6)

由于Perl是松散类型的,并且值可以随时在字符串和整数之间静默转换,Perl需要两种不同类型的比较运算符来区分整数比较(<)和字符串比较({{1} })。如果你只有一个操作员,你会怎么说出差异?

答案 2 :(得分:2)

理?这是一个字符串运算符。来自“perldoc perlop”:

Binary "lt" returns true if the left argument is stringwise less than the right argument.

如果那不是您想要的,请不要使用它。

答案 3 :(得分:2)

lt以词汇方式(即ASCII / UNICODE或语言环境顺序)比较值,<以数字方式比较值。 Perl有两个运算符的原因相同"10" + 515而不是类型错误:它是弱类型的。你必须总是告诉计算机一些明确的东西。强类型语言倾向于使用转换来解决歧义,而弱类型语言倾向于使用大量运算符。相当于"10" + 5的Python(强类型语言)是float("10") + 5

答案 4 :(得分:0)

  

这是否意味着'lt'运算符   总是将变量转换为   字符串,然后比较?

是的,请参阅perlop

  

Perl制作的理由是什么?   'lt'运算符的行为与   '&LT;'操作

因为拥有一个数字比较运算符和一个字符串比较运算符比使用mumble mumble运算符和另一个相同的mumble mumble运算符更有意义。