为什么会出现此错误?

San*_*ing 1 perl json

我收到了这个错误

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解析器解决,那么这将完全没问题=)

怎么了?

mob*_*mob 9

如果您更喜欢数字排序但希望回退到字典排序,请使用此排序功能:

$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)