如何强制将变量视为 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 的。同时,perldocperlnumber 中的讨论可能会有所帮助。 JSON 会自动将字符串放入引号中,但在这种情况下它没有这样做,因为它会将其视为浮点数。 你是说外国 API 对待 key: 0E10key: 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: 0key: '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 中的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

强制 grails 将字符串参数视为字符串的集合

Perl 中的正则表达式组:如何从正则表达式组中捕获与字符串中出现的未知数量/多个/变量匹配的元素到数组中?

如何将字符串变量视为实际代码?

python中字符类型是不是可以强制转化为bool类型

Perl双引号和单引号的区别

强制 mySQL 查询为 R 中的非数字字符