为什么我们在Perl中需要两个相等运算符(“==”和“eq”)?

时间:2013-06-20 12:23:08

标签: python perl operators

在Python中,我可以使用“==”来比较字符串或数字。但在Perl中有“==”和“eq”。对字符串使用“==”可能会导致错误。为什么有两个运营商?只使用“eq”是否安全?

2 个答案:

答案 0 :(得分:9)

Perl具有与Python不同的类型系统。在Python中,字符串和数字是不同的类型。 Perl只有Scalars。

为了区分字符串解释和标量的数字解释,使用了两组比较运算符。

E.g。

my $x = "foo";
my $y = 0;

$x == $y; # true, but warning
$x eq $y; # false

my $x = "1.0";
my $y = 1;

$x == $y; # true
$x eq $y; # false

答案 1 :(得分:6)

关于问题的“为什么”部分:你有两个不同的运算符来做两件事。如果您没有两个操作员,您将无法确定您所做的两个测试中的哪一个。正如您在amon's answer中看到的那样,以下是错误的:

"1.0" eq "1";

但在某些情况下,你可能希望它是真的。换句话说,你所追求的逻辑是数字比较。在某些其他情况下,您可能需要按字符串比较,在这种情况下,您不希望上述内容为真。

因为Perl没有明显的数据类型,每个标量值的类型都取决于上下文,如下所示:

if ($foo == 0)       # $foo is converted to a number
if ($foo eq "0")     # $foo is converted to a string

Perl的一个特性是这种依赖于上下文的转换,当使用错误时它会导致奇怪的行为,例如这个相当常见的问题:

if ("foo" == "bar")  # true

如果没有打开警告pragma use warnings,此语句将返回一个误报,没有任何问题提示。原因是由数字相等运算符==生成的上下文将两个字符串都转换为数字,并且该数字为零0。当然,0 == 0是真的。如果任一字符串以数字开头,则它们将被转换为该数字。