У меня есть некоторый 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
Есть либолее простой (и рабочий) способ сделать это без дублирования моего кода для каждого элемента?:)