用于修改散列引用数组中的值的简写

时间:2011-03-25 02:15:37

标签: arrays perl hash

我有一个哈希引用数组。散列中的日期字段存储在纪元中。在返回数组之前,我必须将其格式化为人类可读。以下是我的代码:

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

我试过了

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

删除除{date}以外的所有字段。

有更聪明的方法吗?

由于

5 个答案:

答案 0 :(得分:5)

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

然后@sorted中的日期将被转换。

答案 1 :(得分:3)

你正在使用的for循环没有什么问题。地图也可以工作,但有两个问题:

  • 数组中的hashref存储在标量$_中。您正在访问哈希%_
  • 块的返回值将在结果数组中结束。在您的情况下,这是赋值的结果而不是整个hashref。

另外,请注意@sorted中的hashrefs将被修改。以下map语句应该适合您:

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

答案 2 :(得分:1)

如果你真的想要:

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

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

我帮助重命名了这个功能,以减少维护程序员被诱惑成为杀人斧头凶手的几率。如果程序员不知道你可以通过正确操纵@_来改变参数,那么仍然可能会有一些震惊因素。

答案 3 :(得分:0)

这相当于您的代码:

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

我不知道为什么你想要两个相同的数组,但我没有看到将这两个不相关的操作结合起来的重点。这只会让你的代码不那么可读。

答案 4 :(得分:0)

如果您想要或不介意不引用@sorted中的相同哈希值,您可以:

my @formatted = map +{ %$_, 'date' => format_time($_->{date}) }, @sorted;