pla*_*etp 1 python perl operators
在Python中,我可以使用"=="来比较字符串或数字.但在Perl中有"=="和"eq".对字符串使用"=="可能会导致错误.为什么有两个运营商?只使用"eq"是否安全?
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)
至于你的问题的"为什么"部分:你有两个不同的运算符来做两件事.如果您没有两个操作员,您将无法确定您所做的两个测试中的哪一个.正如你在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是事实.如果任一字符串以数字开头,则它们将被转换为该数字.