On Sat, Feb 05, 2000 at 10:35:48PM -0500, Nathaniel Irons wrote: > I've got an array full of anonymous hashes, each with 4-6 keys. I would > like to create a few arrays containing uniqued values from one of those > keys, across all the hashes. > > This is a neat one-line trick I got from the Cookbook: > > @unique = grep { ! $seen{ $_ }++ } @not_unique; > > which I assumed I could adapt to my needs: > > @unique_names = grep { ! $seen{ ${$_}{names}++ } @array_of_hashes; Unbalanced curly braces. I think that should be: @unique_names = grep { !$seen{ ${$_}{names} }++ } @array_of_hashes; > which works, in that I get the right number of elements, but fails in > that my new @u_names array is full of hash references, and not stringy > hash values. grep is returning "$_", not "${$_}{names}" as I intended. grep always returns $_ for each match; that's what it's for. grep selects elements from the list that match the conditional expression. > Is there a way to do this in one line? What's so bad about two lines? $seen{ ${$_}{names} }++ foreach @array_of_hashes; @unqiue_names = keys %seen; But here's one line: @unique_names=map{!$seen{${$_}{names}}++?${$_}{names}:()}@array_of_hashes; Ronald ==== Want to unsubscribe from this list? ==== Send mail with body "unsubscribe" to macperl-anyperl-request@macperl.org