On Wed, Feb 06, 2002 at 05:35:44PM +0100, birgit kellner wrote: > my %hash = ( > 'keyone' => ['firstvalueone', 'firstvaluetwo], > 'secondkey' => ['anothervalueone', 'valuetwoforsecondkey'], > 'keythree' => ['thirdvalueone', 'thirdvaluetwo'] > > ); > > Can I sort the hash on the second element of the anonymous array?
The hash itself cannot be sorted, since it's a hash, not a list. However, you can store the keys of the hash in a list that's sorted by your criteria: ---------- snip ---------- my @order=sort { $hash{$a}[1] cmp $hash{$b}[1] } keys %hash; print @order; ---------- snip ---------- 'perldoc -f sort' to find out about codeblocks in the sort command. Basically, 'sort' needs a compare function. That function knows two parameters '$a' and '$b' and returns their relation (perldoc -f cmp). Internally, I believe 'sort' then does a qsort, calling your provided comparism-code each time it has to decide what to do next. The result is the ordered list of hash-keys. > Output should be: > > firstvaluetwo > thirdvaluetwo > valuetwoforsecondkey Ah, you don't want the hash sorted, but only the ordered values of the 2nd column? Similar procedure: ---------- snip ---------- print sort map { $_->[1] } values %hash; ---------- snip ---------- 1st: 'perldoc -f values', 'perldoc -f map'. 'values %hash' gives you a list that contains all right-side parts of the hash print values %hash; gives ARRAY(0x80f60ac) ARRAY(0x8102f24) ARRAY(0x8102edc) Not very helpful, but that's how your array-references look from the inside. Now, the 'map' acts kind like a filter, applying some code to each element of a list and returning a new list that contains all the results of that codeblock. The codeblock gets its parameters via $_, thus '$_->[1]' means 'on each value of %hash give me the 2nd array element. Then that list is then put into sort - you have read 'perldoc -f sort' by now, haven't you? Hmmmm, did I make sense? -- If we fail, we will lose the war. Michael Lamertz | [EMAIL PROTECTED] Nordstr. 49 | http://www.lamertz.net - http://www.perl-ronin.de 50733 Cologne | Priv: +49 221 445420 Germany | Mobile: +49 171 6900 310 -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]