2011-03-25 43 views
0

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

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

我已经试过

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

除了{日期和时间}所有字段都将被丢弃。

有没有更智能的方法?

谢谢

+2

你最初的做法有什么问题? – 2011-03-25 02:30:04

回答

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

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

3

你目前使用的for循环没有任何问题。地图可以工作过,但这里有两个问题:

  • 数组中的hashref存储在标$_。您正在访问哈希%_
  • 该块的返回值是结果数组中的内容。在你的情况下,这是分配的结果,而不是整个hashref。

此外,请注意@sorted中的hashrefs将被修改。下面的图说明应为你工作:

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

这相当于代码:

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

我不知道你为什么要两个相同的数组,但我不认为合并这两个不相干的操作点。它只会让你的代码变得不可读。

0

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

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

如果你真的想:

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

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

我帮忙,改名功能以减少维护程序员被诱惑成为杀人斧杀人犯的几率。如果程序员不知道你可以通过@_的正确操作来更改参数,那么仍然可能会有一些冲击。