2011-03-25 45 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; 

我幫忙,改名功能以減少維護程序員被誘惑成爲殺人斧殺人犯的機率。如果程序員不知道你可以通過@_的正確操作來更改參數,那麼仍然可能會有一些衝擊。