in reply to Re: Sorting a hash value that is a list
in thread Sorting a hash value that is a list

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.


  • Comment on Re^2: Sorting a hash value that is a list

Replies are listed 'Best First'.
Re^3: Sorting a hash value that is a list
by tobyink (Canon) on Feb 28, 2012 at 13:41 UTC

    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.

          Folks, I got a working solution


          Thanks to 'balajesuri' from 'The UNIX and Linux Forums' for this solution.


          #!/usr/bin/perl use strict; use warnings; my ($gid, $grp, $host, $group, $userid); my %table; open FILE, "< /path/to/usrgrps.txt"; foreach (<FILE>) { chomp; ($host, $grp, $gid, $userid) = split /:/; $group = "$grp:$gid"; if (length ($userid) != 0) { (defined $table{$group} && $table{$group} =~ /$_/) ? next : ($ +table{$group}.="$_,") foreach (split /,/, $userid); } else { $table{$group} = ""; } } close FILE; foreach (sort keys %table) { $table{$_} =~ s/,$//; print "$_:$table{$_}\n"; }

          Thank again to all for taking the time to look at this!!


          All the best, g

    Re^3: Sorting a hash value that is a list
    by Anonymous Monk on Feb 28, 2012 at 12:39 UTC