我有一个哈希引用数组。散列中的日期字段存储在纪元中。在返回数组之前,我必须将其格式化为人类可读。以下是我的代码:
for my $post (@sorted) {
$post->{date} = format_time($post->{date});
push @formatted, $post;
}
我试过了
my @formatted = map {$_{date} = format_time($_{date})} @sorted;
删除除{date}以外的所有字段。
有更聪明的方法吗?
由于
答案 0 :(得分:5)
$_->{date} = format_time($_->{date}) for @sorted.
然后@sorted中的日期将被转换。
答案 1 :(得分:3)
你正在使用的for循环没有什么问题。地图也可以工作,但有两个问题:
$_
中。您正在访问哈希%_
。另外,请注意@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;