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]