#!/usr/bin/env perl -l
use strict;
use warnings;
use List::Util qw{first};
my @key_array = 'a' .. 'i';
my @set_array = ( ['a', 'b'], ['e','f'], ['f','g'] );
my %sets;
for my $set_ref (@set_array, map {[$_]} @key_array) {
my $key = first { exists $sets{item}{$_} } @$set_ref;
my $set_data = defined $key
? $sets{item}{$key}
: do { push @{$sets{data}}, {}; $sets{data}[-1] };
for my $item (@$set_ref) {
$sets{item}{$item} = $set_data unless exists $sets{item}{$item};
++$set_data->{$item};
}
}
for (sort { @$b <=> @$a } map { [ sort keys %$_ ] } @{$sets{data}}) {
print join ',' => @$_;
}
####
e,f,g
a,b
c
d
h
i
##
##
[
{ a => 2, b => 2 },
{ e => 2, f => 3, g => 2 },
{ c => 1 },
{ d => 1 },
{ h => 1 },
{ i => 1 },
]
##
##
{
a => $sets{data}[0],
b => $sets{data}[0],
c => $sets{data}[2],
d => $sets{data}[3],
e => $sets{data}[1],
f => $sets{data}[1],
g => $sets{data}[1],
h => $sets{data}[4],
i => $sets{data}[5],
}
##
##
sort { @$b <=> @$a }
##
##
sort keys %$_