2012-09-25 74 views
1

當從一對夫婦arrayrefs的結合具體的數據,我映射改造按照下面的代碼:有沒有一種方法可以從切片列表中構建一個匿名哈希引用?

my @output_data = map { 
    my $ss = $everything->{$_->{username}}; 
    my $distance = $gis->distance ($_->{lat}, $_->{long} => $ss->{Latitude}, $ss->{Longitude}); 
    my %data; 
    @data{qw/username addr1 addr2 city state zip rec_lat rec_long/} = @{$_}{qw/username addr1 addr2 city state zip lat long/}; 
    @data{qw/ss_lat ss_long/} = @{$ss}{qw/Latitude Longitude/}; 
    $data{difference} = sprintf("%.3f", $distance->miles); 
    \%data; 
} @$source; 

其中一期工程。它通過添加來自初始數據集(它們各自不包含整個行,正是我所關心的)的片段以及兩者之間的計算結果來構建哈希。有沒有一種方式可以將結束行乾淨地組合成單個匿名hashref構造函數?或者像這樣構建結果數據集是最好的方法?

+0

爲了可讀性,你不應該把這些東西放在map中,而應該放在foreach中。 – simbabque

+0

這是我去的第一種方式 - 但遇到了編寫push()的問題,因爲我無法弄清楚如何構建在推式上使用的匿名hashref(@output_data,...)編輯:或者說,我可以在塊中創建%數據,只需按(@output_data,\%data),是的。 – Oesor

回答

1

您需要類似pairwise的東西。

use List::MoreUtils qw(pairwise); 

my @output_data = 
    map +{ 
     (pairwise { $a => $_->{$b} } 
     @{[qw(username addr1 addr2 city state zip rec_lat rec_long)]}, 
     @{[qw(username addr1 addr2 city state zip lat  long )]}, 
    ), 
     (pairwise { $a => $ss->{$b} } 
     @{[qw(ss_lat ss_long )]}, 
     @{[qw(Latitude Longitude)]}, 
    ), 
    }, 
     @$source; 
+0

出乎意料的清晰! – ikegami

+0

當然可以;謝謝! – Oesor

相關問題