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

pla*_*etp 1 python perl operators

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

amo*_*mon 9

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

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

例如

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

$x == $y; # true, but warning
$x eq $y; # false
Run Code Online (Sandbox Code Playgroud)

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

$x == $y; # true
$x eq $y; # false
Run Code Online (Sandbox Code Playgroud)


TLP*_*TLP 6

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

"1.0" eq "1";
Run Code Online (Sandbox Code Playgroud)

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

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

if ($foo == 0)       # $foo is converted to a number
if ($foo eq "0")     # $foo is converted to a string
Run Code Online (Sandbox Code Playgroud)

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

if ("foo" == "bar")  # true
Run Code Online (Sandbox Code Playgroud)

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