Почему возникает эта ошибка? - PullRequest
1 голос
/ 06 июня 2011

Я получаю эту ошибку

Argument "\\x{61}" isn't numeric in numeric comparison (<=>)

от

#!/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);

Предполагается кодировать хеш в строку json, а затем численно сортировать ключи 12 1 2.

Если проблему можно решить с помощью другого анализатора JSON, то это будет прекрасно =)

Что не так?

Ответы [ 2 ]

9 голосов
/ 06 июня 2011

Если вы предпочитаете числовую сортировку, но хотите вернуться к лексикографической сортировке, используйте эту функцию сортировки:

$json_string = $json->sort_by(
                    sub {
                        $JSON::PP::a <=> $JSON::PP::b
                                  ||
                        $JSON::PP::a cmp $JSON::PP::b
                    }
                )->encode($data);

Если ключи сортировки не являются числовыми, оператор числового сравнения (<=>) вернет 0, а функция выполнит операцию лексического сравнения (cmp).


Редактировать (вышеупомянутое решение все еще не подавляло предупреждения). Для подавления предупреждений требуется еще несколько настроек. Вы могли бы сказать

sub {
    no warnings 'numeric';
    $JSON::PP::a <=> $JSON::PP::b || $JSON::PP::a cmp $JSON::PP::b
}
4 голосов
/ 06 июня 2011

Поскольку aaa bbb a2 не являются числом, вы, вероятно, хотите лексикографическую сортировку.

Попробуйте заменить <=> на cmp:

 $json_string = $json->sort_by(sub { $JSON::PP::a cmp $JSON::PP::b })->encode($data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...