1

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

4

2 回答 2

9

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

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

例如

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
于 2013-06-20T12:25:27.377 回答
6

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

"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

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

于 2013-06-20T12:50:10.967 回答