У меня есть JSON, хранящийся в столбце базы данных, который выглядит так:
pokeapi=# SELECT height FROM pokeapi_pokedex WHERE species = 'Ninetales';
-[ RECORD 1 ]------------------------------------------
height | {"default": {"feet": "6'07\"", "meters": 2.0}}
Как часть алгоритма генерации, над которым я работаю, я хотел бы взять это значение в% хэш, умножить его на (0.9..1.1).rand
(чтобы учесть «естественную 10% дисперсию по высоте»), а затем создать новый % хеша в той же структуре. Мой select-height
метод выглядит так:
method select-height(:$species, :$form = 'default') {
my %heights = $.data-source.get-height(:$species, :$form);
my %height = %heights * (0.9..1.1).rand;
say %height;
}
Что на самом деле вызывает мою get-height
процедуру, чтобы получить «средние» высоты (как в метрических, так и в английских единицах) для этого вида.
method get-height (:$species, :$form) {
my $query = dbh.prepare(qq:to/STATEMENT/);
SELECT height FROM pokeapi_pokedex WHERE species = ?;
STATEMENT
$query.execute($species);
my %height = from-json($query.row);
my %heights = self.values-or-defaults(%height, $form);
return %heights;
}
Однако при выполнении мне выдается следующая ошибка (я предполагаю, потому что я пытаюсь несколько хешировать в целом, а не по отдельным элементам хеша):
$ perl6 -I lib/ examples/height-weight.p6
{feet => 6'07", meters => 2}
Odd number of elements found where hash initializer expected:
Only saw: 1.8693857987465123e0
in method select-height at /home/kane/Projects/kawaii/p6-pokeapi/lib/Pokeapi/Pokemon/Generator.pm6 (Pokeapi::Pokemon::Generator) line 22
in block <unit> at examples/height-weight.p6 line 7
Есть ли более простой (и рабочий) способ сделать это без дублирования кода для каждого элемента? :)
my %hash = :a, :b; say %hash».rand # {a => 0.12201023810083333, b => 0.3360358162308337}
- person raiph   schedule 18.04.2019%heights
в методеget-height
, вы можете просто удалить его вместе с операторомreturn
, оставив только вызов метода дляvalues-or-defaults
. - person Takao   schedule 18.04.2019