【发布时间】:2014-01-26 08:45:59
【问题描述】:
我制作了这个脚本来检查在意外使用“eq”而不是“==”时标量如何变化,反之亦然。在字符串上使用 '==' 不会改变任何东西,但在数字上使用 'eq' 会使标量以某种方式发生变化。代码来了:
#!/usr/bin/perl
use strict;
use JSON;
my $str = "123";
my $num = 123;
print "BEFORE:\n";
print "str: ", \$str, " num: ", \$num, "\n";
print to_json({str => $str, num => $num}, {pretty => 1});
if ($str == 23) { }
if ($num eq "123") { }
print "AFTER:\n";
print "str: ", \$str, " num: ", \$num, "\n";
print to_json({str => $str, num => $num}, {pretty => 1});
print "\n";
输出:
BEFORE:
str: SCALAR(0x8010f8) num: SCALAR(0x801050)
{
"num" : 123,
"str" : "123"
}
AFTER:
str: SCALAR(0x8010f8) num: SCALAR(0x801050)
{
"num" : "123",
"str" : "123"
}
通过文字,$num 由数字变为字符串。通过注释行
if ($num eq "123") { }
$num 不再更改。这是错误还是功能?为什么会这样?另外,如果不使用 to_json,我怎么能看到这个?
perl --version
This is perl 5, version 14, subversion 2 (v5.14.2) built for x86_64-linux-gnu-thread-multi
【问题讨论】:
-
我不会说这个问题与 stackoverflow.com/a/12693984/223226 重复。当然,这个问题回答了我如何在不使用 to_json 的情况下查看类型,但我真正的问题是我的代码的结果是错误还是功能,例如为什么 eq 运算符会更改参数的类型。
-
Numeric 在 Perl 中不是一个类型,它是一个上下文。很可能 Perl 缓存并优先考虑与标量值关联的上下文数据(您可以使用
Devel::Peek获取有关标量发生的更多信息)。至于这里的基本原理/设计是什么,我不知道。部分是to_json的一个特性,而不是 Perl - 它必须从它可以找到的任何东西中获取提示,如果一个标量被同时视为一个数字和一个字符串,它就会变得混乱(或安全地玩)跨度>