in reply to Sorting a hash value that is a list

When you need to find a unique-anything, I almost always use a hash.   In this case, the “auto-vivification” goodness of Perl is simply natural ... $myhash->{$group}{$gid}{$user}=1;.   (You don’t care what the value is.)   Any of the buckets in the entire structure that do not exist yet will, simply, appear when they are required.   Then just loop through sorted keys as you do.   To print out the final comma-separated list of users, join(',', sort keys hashref) is made for the part.

Replies are listed 'Best First'.
Re^2: Sorting a hash value that is a list
by g_string (Initiate) on Feb 28, 2012 at 12:23 UTC

    Hi again,


    Thanks for all the replys, it much appreciated; I've tried all solutions (except for 'AnomalousMonk' as I work for large corporation, getting extra modules to use requires going to the DMZ which is not feasible - so I'm stuck with the bundle Solaris 10 comes with). I'm still not getting a unique list of users and this what I think is happening: When the hash pulls all the unique values ($userid) to each unique key ($group), the value is taken as a block. So for example:


    This:
    group1:9001:user1,user2,user3,user4,user5,user1,user2,user3,user4,user5,user1,user2,user3,user4,user5
    group2:9002:user1,user2,user3,user1,user2,user3,user1,user2,user3
    group3:9003:user1,user2,user4,user1,user2,user4,user1,user2,user4
    group4:9004:user1,user2,user5,user1,user2,user5,user1,user2,user5
    group5:9005:user1,user2,user1,user2,user1,user2
    group6:9006:,,,


    Is actually this in the hash:
    group1:9001:"user1,user2,user3,user4,user5," "user1,user2,user3,user4,user5," "user1,user2,user3,user4,user5"
    group2:9002:"user1,user2,user3," "user1,user2,user3," "user1,user2,user3"
    group3:9003:"user1,user2," "user4," "user1,user2,user4," "user1,user2," "user4"
    group4:9004:"user1,user2," "user5," "user1,user2," "user5," "user1,user2," "user5"
    group5:9005:"user1,user2," "user1,user2," "user1,user2"
    group6:9006:"," "," ","


    So each block of userid's is a unique value.
    I'm lost on how to do this (if there is a way).
    Hope that makes sense?
    Any feedback will be greatly appreciated.
    Thanks again.


      As another monk mentioned, most of the reasons people think they can't install from CPAN are in fact non-reasons.

      But either way, the uniq function from List::MoreUtils is easy for you to implement yourself:

      sub uniq (@) { my %seen = (); grep { not $seen{$_}++ } @_; }

      As it happens, I just copied and pasted that code from List/MoreUtils.pm. However, one reason to prefer List::MoreUtils over a home-made version, is that List::MoreUtils provides an XS version which (over large lists) may run a little faster.