与simbabque 的答案相反,我真的不认为使用引用作为\1 和\0 在JSON 中生成true 和false 是一个好主意。
JSON module 中的常量不仅仅是为了方便。
如果您使用此类常量,您仍然可以在 Perl 中将它们评估为 true 或 false 值,而在 Perl 中 \0 和 \1 都被评估为 true。
使用这些常量,除了在 Perl 中保留布尔值外,还可以在 JSON 中工作以生成正确的数据。
这是我所说的一个例子:
use 5.010;
use strict;
use warnings;
use JSON qw(encode_json decode_json);
my $data = {
true_1 => JSON::true,
true_2 => \1,
false_1 => JSON::false,
false_2 => \0,
};
for my $key (sort keys %$data) {
say "$key value is $data->{$key} and is evaluated as true" if $data->{$key};
say "$key value is $data->{$key} and is evaluated as false" if not $data->{$key};
}
say encode_json $data;
该代码将输出如下内容:
false_1 value is 0 and is evaluated as false
false_2 value is SCALAR(0x146f39b4c18) and is evaluated as true
true_1 value is 1 and is evaluated as true
true_2 value is SCALAR(0x146f3998918) and is evaluated as true
{"true_2":true,"false_1":false,"false_2":false,"true_1":true}
如您所见,引用 \0 (false_2) 的值在 Perl 中被评估为 true,而设置为 JSON::false 的值仍然是false 在 Perl 评估中。
另外,你可以看到,当打印JSON::true和JSON::false的值时,它们会自动转换为1和0,而\1和\0打印为SCALAR(0x146f3998918)和SCALAR(0x146f39b4c18)。
最后,当转换为JSON 时,两者都能正常工作。但是在 Perl 数据结构中设置应该为假的“真”值(0、空字符串或undef),可能会导致代码的其他部分出现错误,您可能会使用相同的结构和评估布尔字段来做某事。
此外,在开发级别,同行开发人员在使用 JSON::true 和 JSON::false 时更容易理解您正在编码的内容,而不是看到参考为 \1 和 \0 而无法理解如果他/她不熟悉这种 hacky 技巧,那么参考的原因。
如果您真的不想输入额外的 6 个字符,那么您可以在代码顶部执行此操作:
use JSON qw(encode_json decode_json);
sub true () { JSON::true }
sub false () { JSON::false }
然后您可以简单地将它们用作代码中的常量,如下所示:
$data = {
is_member => true,
is_suspended => false,
}
虽然,也许常量名称应该全部大写(如TRUE 和FALSE),但这是另一个讨论的主题。
因此,在使用 Perl 和 JSON 时,请始终使用 JSON::true 和 JSON::false。它们将在 Perl 中很好地评估,它们被转换为 JSON 中的正确数据类型,并且它们正确地打印到控制台和文件。 JSON::null 也是如此。