2012-09-25 37 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

相关问题