这是按我预期工作的代码:
#!/usr/bin/perl
use strict;
use warnings FATAL => 'all';
use feature qw(say);
use constant MY_CONSTANT => 42;
use JSON::XS;
say encode_json { value => MY_CONSTANT };
此代码输出:
{"value":42}
但是如果常量用于字符串连接,然后在 json 中设置一个数字,我会得到字符串:
#!/usr/bin/perl
use strict;
use warnings FATAL => 'all';
use feature qw(say);
use constant MY_CONSTANT => 42;
use JSON::XS;
say encode_json { value => MY_CONSTANT };
my $smth = 'asdf' . MY_CONSTANT;
这是输出:
{"value":"42"}
对我来说,“常量”根据它的使用方式改变它的行为是非常出乎意料的。
有没有办法在perl中定义一个带有数字的常量,即使在串联中使用,该常量也会转换为json中的数字值。
理想情况下,无论您使用
"42"
还是 42
初始化变量,Perl 都会将四十二视为四十二。 JSON::XS 破坏了该模型,这会导致与您看到的结果类似的结果。
您可以使用 sub 而不是常量。
sub MY_CONSTANT() { return 42 }
这样,它每次都会返回一个新的标量。
return
很重要,因为它阻止将 sub 转换为常量。
但更好的解决方案可能是切换到 Cpanel::JSON::XS 并使用 Cpanel::JSON::XS::Type 告诉编码器如何序列化字段。