Проблема в том, что values
действительно, очень хочет, чтобы хеш работал.Это потому, что он особенный: он очищает заполнитель, используемый each
.Требуется фактический объект, чтобы очистить это.
Вы можете пойти одним из двух способов здесь.Во-первых, если вам не нравится ref / deref, вы можете просто вытащить создание временного хэша из однострочного (пожалуйста, выберите более точное имя, чем %h
для вашего фактического кода):
my %h = map { $_->{id} => $_->{value} } @obs;
say for values %h;
Если вы не хотите, чтобы %h
зависал, просто поместите его во временный блок:
...code code code...
{
my %h = map { $_->{id} => $_->{value} } @obs;
say for values %h;
}
...code code code...
Другим подходом может быть эмуляция создания вашего временного хеша, и values
делать:
my %seen;
for ( reverse @obs ) { say $_->{value} unless $seen{$_->{id}}++ }
Что действительно важно, так это то, что вы собираетесь делать с этими данными.Если вам просто нужны значения вашего инвертированного хэша только один раз, то ваш однострочный может быть лучшим решением.Если вам понадобятся эти данные (id и значение) позже, то создайте реальный хеш и используйте его - не делайте это преобразование более одного раза, чтобы вы могли сохранить их как однострочные.
Без дальнейшего контекста трудно дать совет, какой подход выбрать.