use Data::Dumper; my %field_filter = (creation_date => sub { my $datetime = shift; return (split ' ', $datetime)[0] } ); my @fields = (qw(creation_date a b)); my @hash_ops = ({a => '', b => 2, creation_date => '12/31/2005 12:32:11'}, {a => 5, b => 0, creation_date => '23/01/2222 13:14:15'}); my @loop_data; for my $hash_op (@hash_ops) { my %row_data; foreach my $field (@fields) { if ($hash_op->{$field}) { $row_data{$field} = exists $field_filter{$field} ? $field_filter{$field}->($hash_op->{$field}) : $hash_op->{$field}; } else { $row_data{$field} = '-'; } } push (@loop_data, \%row_data); } print Dumper(\@loop_data) #### $VAR1 = [ { 'a' => '-', 'creation_date' => '12/31/2005', 'b' => 2 }, { 'a' => 5, 'creation_date' => '23/01/2222', 'b' => '-' } ];