我收到了这个错误
Argument "\\x{61}" isn't numeric in numeric comparison (<=>)
Run Code Online (Sandbox Code Playgroud)
从
#!/usr/bin/perl
use JSON::PP;
use utf8;
use strict;
use warnings;
use Data::Dumper;
my $json = JSON::PP->new->allow_nonref;
$json = $json->utf8;
my $data = {
12 => {
a => 1,
b => 2,
},
1 => {
x => 3,
},
2 => {
z => 4,
}
};
my $json_string = $json->sort_by(sub { $JSON::PP::a <=> $JSON::PP::b })->encode($data);
Run Code Online (Sandbox Code Playgroud)
假设将散列编码为json字符串,然后对键进行数字排序12 1 2.
如果问题可以通过另一个JSON解析器解决,那么这将完全没问题=)
怎么了?
如果您更喜欢数字排序但希望回退到字典排序,请使用此排序功能:
$json_string = $json->sort_by(
sub {
$JSON::PP::a <=> $JSON::PP::b
||
$JSON::PP::a cmp $JSON::PP::b
}
)->encode($data);
Run Code Online (Sandbox Code Playgroud)
当排序键不是数字时,数字比较(<=>)运算符将返回0并且该函数将执行词法比较(cmp)操作.
编辑(上面的解决方案仍然没有抑制警告).需要进行一些调整来抑制警告.你可以说
sub {
no warnings 'numeric';
$JSON::PP::a <=> $JSON::PP::b || $JSON::PP::a cmp $JSON::PP::b
}
Run Code Online (Sandbox Code Playgroud)