Сокращение, чтобы изменить значение в массиве ссылок на хеш - PullRequest
0 голосов
/ 25 марта 2011

У меня есть массив хеш-ссылок.Поле даты в хеше хранится в эпоху.Я должен отформатировать его для чтения человеком, прежде чем возвращать массив.Вот мой код:

for my $post (@sorted) {
        $post->{date} = format_time($post->{date});
        push @formatted, $post;
}

Я пробовал

my @formatted =  map {$_{date} = format_time($_{date})} @sorted;

Все поля, кроме {date}, пропущены.

Есть ли более умный метод?

Спасибо

Ответы [ 5 ]

5 голосов
/ 25 марта 2011
$_->{date} = format_time($_->{date}) for @sorted.

Тогда даты в @sorted будут конвертированы.

3 голосов
/ 25 марта 2011

Нет ничего плохого в том, что вы используете цикл for.Карта тоже может работать, но есть две проблемы:

  • Хэш-ссылка в массиве хранится в скаляре $_.Вы обращаетесь к хешу %_.
  • . Возвращаемое значение блока - это то, что в итоге будет в массиве результатов.В вашем случае это результат присваивания, а не весь хэш-адрес.

Кроме того, обратите внимание, что хэш-ссылки в @sorted будут изменены.Следующий оператор карты должен работать для вас:

my @formatted = map { $_->{date} = format_time($_->{date}); $_ } @sorted;
1 голос
/ 25 марта 2011

Если вы действительно хотите:

sub format_time_in_place {
    my $time = $_[0];
    # do work
    $_[0] = $reformatted_time;
}

# elsewhere
format_time_in_place($_->{date}) for @sorted;

Я переименовал эту функцию, чтобы уменьшить вероятность того, что программист по техническому обслуживанию испытывает желание стать убийцей топора-убийцы. Все еще может быть элемент шока, если указанный программист не знал, что вы можете изменить передаваемые аргументы с правильной манипуляцией @_.

0 голосов
/ 25 марта 2011

Если вы хотите или не возражаете против того, чтобы ссылаться на те же хеши, что и в @sorted, вы можете:

my @formatted = map +{ %$_, 'date' => format_time($_->{date}) }, @sorted;
0 голосов
/ 25 марта 2011

Это эквивалентно вашему коду:

$_->{date} = format_time($_->{date}) for @sorted;
@formatted = @sorted;

Я не знаю, зачем вам два идентичных массива, но я не вижу смысла объединять эти две несвязанные операции.Это сделает ваш код менее читабельным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...