在Python中,我可以使用“==”来比较字符串或数字。但在Perl中有“==”和“eq”。对字符串使用“==”可能会导致错误。为什么有两个运营商?只使用“eq”是否安全?
答案 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
是真的。如果任一字符串以数字开头,则它们将被转换为该数字。