确定perl标量是字符串还是整数

Adr*_*oma 4 variables perl json

从我读到的,perl没有整数或字符串的实数类型,对他来说任何$变量都是标量.

最近我在一个旧脚本上遇到了很多麻烦,这个脚本生成了另一个进程所需的JSON对象,JSON中的值必须是整数,经过一些调试我发现因为一个简单的打印函数:

JSON :: encode_json

生成一个字符串而不是整数,这是我的例子:

use strict; 
use warnings; 
use JSON;
my $score1 = 998;
my $score2 = 999;
print "score1: ".$score1."\n";
my %hash_object = ( score1 => $score1, score2 => $score2 );
my $json_str = encode_json(\%hash_object);  # This will work now
print "$json_str";
Run Code Online (Sandbox Code Playgroud)

它输出:

score1: 998
{"score1":"998","score2":999}
Run Code Online (Sandbox Code Playgroud)

不知何故,perl变量有一个类型,或者至少这是JSON :: encode_json的思考方式.

有没有办法以编程方式找到此类型以及为什么在进行上述连接操作时更改此类型?

Ole*_*kov 7

首先,它有点不正确.是的,每个值都是标量,但标量具有单独的数值和字符串值.这就是你需要知道的关于这个特定问题的所有内容,所以我将详细说明.

你真正需要的是看一下JSON模块文档的MAPPING/PERL - > JSON/simple scalars部分:

JSON :: XS和JSON :: PP将未定义的标量编码为JSON空值,最后在编码为JSON字符串之前在字符串上下文中使用的标量,以及其他任何作为数值的标量.

(这里的文档实际上有点错误.它不是"最后一次在字符串上下文中使用"它应该"在字符串上下文中使用过" - 一旦标量获得字符串值,它就不会消失,直到你明确写出一个新的数字进去.)

您可以通过对其进行字符串化来强制类型为字符串:

my $x = 3.1; # some variable containing a number
"$x";        # stringified
$x .= "";    # another, more awkward way to stringify
print $x;    # perl does it for you, too, quite often
Run Code Online (Sandbox Code Playgroud)

顺便提一下,上面的评论正是为什么你的998转向字符串.

您可以通过编号强制类型为数字:

my $x = "3"; # some variable containing a string
$x += 0;     # numify it, ensuring it will be dumped as a number
$x *= 1;     # same thing, the choice is yours.
Run Code Online (Sandbox Code Playgroud)