如何从perl脚本发送布尔值而不将它们转换为字符串

Sub*_*ash 5 perl json boolean

我将Perl数据结构传递给encode_json,并使用其返回值作为输入来发布到restful API.

例:

$data = (input1 => true);
$json_data = encode_json($data);
print $json_data; // Prints: ["input1":"true"]

$url= http://api.example.com/resources/getDataAPI
$headers = {Accept => 'application/json', Authorization => 'Basic ' . encode_base64($username . ':' . $password)};

$client = REST::Client->new();
$client->POST($url,($json_data,$headers));
Run Code Online (Sandbox Code Playgroud)

这一切都很好.

最近,另一个开发人员进行了很少的输入参数验证检查,REST严格接受布尔值,没有引号.

我现在需要发送我的输入

$data = '["inout1":true]'
$client = REST::Client->new();
$client->POST($url,($data,$headers));
Run Code Online (Sandbox Code Playgroud)

我的所有脚本都失败了,因为输入数据使用encode_json函数编码为JSON格式.

我可以手动形成JSON数据,但输入数据有时会非常庞大​​.无法识别它们并随时修改.

有没有办法可以实现没有引号的传递布尔值?

sim*_*que 15

直接在Perl中使用truefalse语法错误是use strict因为不允许使用裸词.

我猜你使用的是JSONJSON :: XS.那些使用标量引用来表示TRUEFALSE.具体来说,\1\0.

$data = ( input1 => \1 );
Run Code Online (Sandbox Code Playgroud)

这是来自JSON :: XS的相关文档,它允许Types :: Serializer :: True和Types :: Serializer :: False:

来自Types :: Serialiser模块的这些特殊值分别变为JSON true和JSON false值.您也可以使用\1\0直接,如果你想要的.

从JSON的文档,其中JSON::trueJSON::false也可用于:

这些特殊值分别变为JSON true和JSON false值.您也可以使用\1\0直接,如果你想要的.


如果你坚持true不使用引号my $foo = true,你可以制作返回\1和的子或常量(实际上是子)\0.

use constant false => \0;
sub true () { return \1 } # note the empty prototype

$data = ( input1 => true, input2 => false );
Run Code Online (Sandbox Code Playgroud)

正如Sinan在他的评论中指出的那样,使用常量更快,除非你包含一个空原型(()在子定义中),因为这样Perl可以内联调用.

但在我看来,这不仅仅是简单地使用参考文献.总是想想下一个处理这段代码的人.

  • 有关内联的内容记录在[*perlsub`中的常量函数*]下(https://perldoc.perl.org/perlsub.html#Constant-Functions)我的意思是JSON布尔值的引用.我一直使用`JSON :: true`和`JSON ;; false`. (2认同)