如何强制将变量视为 perl 中的字符串?
Posted
技术标签:
【中文标题】如何强制将变量视为 perl 中的字符串?【英文标题】:How to force a variable to be treated as a String in perl? 【发布时间】:2013-07-10 12:38:14 【问题描述】:我有一个 JSON 对象,它有一个键值对,其中一对的值为 0E10。
问题是这个值应该是一个字符串,但由于在数字后存在字母 E,它被视为浮点数,因此每当我打印这个值时它都显示 0 ( 0*e+10)。
有人可以帮我解决这个问题吗?
我正在使用 perl 传递 JSON 并通过 javascript 读取它。 (任何语言的解决方案都可以接受)
这是我打印 JSON 时得到的。
KEY1 : 0E10
KEY2:“XYZ”
您可以清楚地看到,如果值是字符串,它会放在引号 (") 下,但对于 0E10,它没有使用引号 (")。
我的问题是我正在从一个我无法控制的 API 读取 JSON。我有一个用 perl 编写的后端服务,它传递 API 返回的 JSON。因此,每当我点击一个 URL 时,就会调用用 perl 编写的后端服务。此服务从 API 获取 JSON 并将 JSON 返回到访问 URL 的服务。
【问题讨论】:
你能粘贴这样的json吗?如何解码? 你有0E10
而不是"0E10"
,所以它不像字符串
您需要向人们展示您是如何创建 JSON 的。同时,perldoc
perlnumber
中的讨论可能会有所帮助。
JSON 会自动将字符串放入引号中,但在这种情况下它没有这样做,因为它会将其视为浮点数。
你是说外国 API 对待 key: 0E10
和 key: 0
的方式不同,你想要前者吗?
【参考方案1】:
看看区别:
选项 A
use strict;
use warnings;
use JSON;
my $value = 12345;
my $hr = KEY1=> $value, KEY2=> "XYZ" ;
my $json = encode_json $hr;
print $json, "\n";
#<-- prints: "KEY2":"XYZ","KEY1":12345
选项 B:双引号将 $value 赋值给 KEY1
use strict;
use warnings;
use JSON;
my $value = 12345;
my $hr = KEY1=> "$value", KEY2=> "XYZ" ;
my $json = encode_json $hr;
print $json, "\n";
#<-- prints: "KEY2":"XYZ","KEY1":"12345"
【讨论】:
但是当我将 $value 设为 0E10 时,它会打印为 0。在我的情况下,问题是我正在从我无法控制的 API 读取 JSON。我有一个用 perl 编写的后端服务,它传递 API 返回的 JSON。因此,每当我点击一个 URL 时,就会调用用 perl 编写的后端服务。该服务从 API 获取 JSON 并将 JSON 返回到访问 URL my $value = 0E10; 的服务。我的 $hr = KEY1=> "$value", KEY2=> "XYZ" ;我的 $json = encode_json $hr;打印 $json, "\n"; # 当你说my $value = 0E10
时,字符串信息已经丢失。你需要说my $value = "0E10"
。
0E10 在数字上下文中没有意义,因为这是 0*10**10 = 0...也许您需要的数字是 1E10 ¿?【参考方案2】:
如果您想生成key: 0E10
(而不是key: 0
和key: '0E10'
),那么您必须生成自己的JSON。 Perl 无法以不同于0E9
的方式存储0E10
。 (JavaScript、Java、C、C++ 等也不行)
如果您愿意接受任何指数,您可能仍需要生成自己的 JSON。 Perl 没有类型系统,JSON 编码器倾向于对整数使用整数表示法(在数学意义上)。
我专门测试了 JSON::XS 和 JSON::PP 将使用 0
作为内部存储为浮点数的零。
$ perl -MJSON::XS -MDevel::Peek -E'($_=1.1)-=$_; Dump $_; say encode_json([$_]);'
SV = PVNV(0x8002b7d8) at 0x800720f0
REFCNT = 1
FLAGS = (NOK,pNOK)
IV = 1
NV = 0
PV = 0
[0]
$ perl -MJSON::PP -MDevel::Peek -E'($_=1.1)-=$_; Dump $_; say encode_json([$_]);'
SV = PVNV(0x801602b0) at 0x8008e520
REFCNT = 1
FLAGS = (NOK,pNOK)
IV = 1
NV = 0
PV = 0
[0]
(NOK
表示标量包含存储为浮点数的值。)
【讨论】:
以上是关于如何强制将变量视为 perl 中的字符串?的主要内容,如果未能解决你的问题,请参考以下文章