我只是在学习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
运算符的行为与 <
运算符的不同之处是什么?
谢谢,
答案 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" + 5
是15
而不是类型错误:它是弱类型的。你必须总是告诉计算机一些明确的东西。强类型语言倾向于使用转换来解决歧义,而弱类型语言倾向于使用大量运算符。相当于"10" + 5
的Python(强类型语言)是float("10") + 5
。
答案 4 :(得分:0)
这是否意味着'lt'运算符 总是将变量转换为 字符串,然后比较?
是的,请参阅perlop
Perl制作的理由是什么? 'lt'运算符的行为与 '&LT;'操作
因为拥有一个数字比较运算符和一个字符串比较运算符比使用mumble mumble运算符和另一个相同的mumble mumble运算符更有意义。