my take on it...
#!/usr/bin/perl -w
# AoH_map.pl --- Perlmonks: Counting elements in array of cases
# Link: https://perlmonks.org/?node_id=11106779
# Author: <LanX>
# Base: <tybalt89> https://perlmonks.org/?node_id=11106792
# Created: 28 Sep 2019
# Version: 0.03
use warnings;
use strict;
use Test::More;
sub transform {
my %prev;
my %origin;
return map {
my $target = $_->{targetL};
my $origin = $_->{origin};
if ( my $prev = $prev{$target} ) {
$prev->{count} += $_->{count};
$prev->{origin} .= " $origin"
unless $origin{$target}{$origin}++; #
+ ++ FIXED
() # skip duplicate
} else {
$origin{$target}{$origin} = 1;
$prev{$target} = { %$_ }; # return first (clone)
}
} @_;
}
# ---------- tests
is_deeply (
[ transform(
{'targetL' => 'foisonnement', 'origin' => 'AMG', 'count' => '1
+'},
{'targetL' => 'foisonnement', 'origin' => 'IDBR', 'count' => '
+1'},
{'targetL' => 'gonfler', 'origin' => 'IWWF', 'count' => '1'},
{'targetL' => 'due', 'origin' => 'IWWF', 'count' => '1' },
{'targetL' => 'due', 'origin' => 'IWWF', 'count' => '1' },
)
],
[
{'targetL' => 'foisonnement','origin' => 'AMG IDBR','count'=>'
+2'},
{'targetL' => 'gonfler','origin' => 'IWWF','count' => '1'},
{'targetL' => 'due','origin' => 'IWWF','count' => '2'},
]
);
is_deeply (
[ transform(
{'targetL' => 'foisonnement', 'origin' => 'AMG', 'count' => '1
+'},
{'targetL' => 'foisonnement', 'origin' => 'IDBR', 'count' => '
+1'},
{'targetL' => 'foisonnement', 'origin' => 'AMG', 'count' => '1
+'},
{'targetL' => 'foisonnement', 'origin' => 'IDBR', 'count' => '
+1'},
)
],
[
{'targetL' => 'foisonnement','origin' => 'AMG IDBR','count'=>'
+4'},
]
);
done_testing;
C:/Perl_524/bin\perl.exe d:/tmp/pm/AoH_map.pl
ok 1
ok 2
1..2
Compilation finished at Sun Sep 29 00:44:35
update
added missing ++ and testcase, see reply from rsFalse for details.