in reply to Re^5: inverting hash / grouping values
in thread inverting hash / grouping values

> Best would be to just add your code to some of the core modules

not that easy I'm still struggling to see the best API for a set of functionals operating on hashes.

for instance my function invert should be renamed because you can do %h2= invert invert %h such that you get the original back. so maybe hash_part or hpart might be better.

To have a real "mathematical" invert one has to consider a special structure relation which is effectively a HoA (simple hashes are "functions" which can only be inverted if they are bijective i.e. have unique values)

DB<131> sub invert { my %h=@_; my %h2; while ( my ($k,$v) = each %h ) { push @{ $h2{$_} } , $k for @$v; } return %h2; } DB<134> %t = (1 => ["e", "c", "a"], 2 => ["b", "d", "f"], 3=>[a] ) => (1, ["e", "c", "a"], 2, ["b", "d", "f"], 3, ["a"]) DB<135> invert %t => ("e", [1], "c", [1], "a", [1, 3], "b", [2], "d", [2], "f", [2]) DB<136> invert invert %t => (1, ["e", "c", "a"], 3, ["a"], 2, ["b", "d", "f"])

Now taking the last use cases we saw, I'm not sure how this special application of invert would help.

AND I had to change the interface, to be chainable.

Originally I was operating on a hash_reference and not a list.

DWIM isn't easy here, prototypes don't allow mixing '%hashes' and LISTs, such that the former is taken as reference.

(One might pass an explicit reference '\%hash' and check if the LIST has just one element. Well not very elegant ...)

Hope you understand my struggles...