SPUG: Sorting hash question

Matt Tucker tuck at whistlingfish.net
Tue Apr 30 15:11:16 CDT 2002


-- Peter Darley <pdarley at kinesis-cem.com> spake thusly:

> 	I currently have a hash that looks like
> 		$Item{Children}{[child #]}{other stuff}
> 
> 	A couple of examples would be:
> 		$Item{Children}{1}{name}
> 		$Item{Children}{1}{content}
> 		$Item{Children}{2}{name}
> 		$Item{Children}{2}{content}
> 
> 	I'm getting at the Children of Item using:
> 		for $SubItem (values %{$$Item{Children}})

Why are you dereferencing it like this? %{$Item{Children}} is
sufficient. Additionally, if you're using numbers, why not just use an
array? Something like:

 		$Item{Children}[1]{name}
 		$Item{Children}[1]{content}
 		$Item{Children}[2]{name}
 		$Item{Children}[2]{content}

Unless, of course, the numbering is more sparse than the example you
give, in which case hashes probably make sense.

> 	which gives me an unsorted list of items.  I would like to have it
> sorted in the order of the keys of the %{$Item{Children}}.  I found
> lots of info on how to step through the keys of a hash sorted by
> value, but not anything on stepping through the values of a has
> sorted by key.  Is this easily doable, or should I do something like:
> 
> 	for $SubItem (sort {$a<=>$b} keys %{$$Item{Children}})
> 	{
> 		$SubItem = $$Item{Children}{$SubItem};
> 		...
> 	}

This is a perfectly reasonable way to do it, although I would suggest
not repurposing the $SubItem variable. A better snippet would be:

	for my $subkey (sort {$a<=>$b} keys %{$Item{Children}})
	{
		my $subItem = $Item{Children}{$subkey};
		...
	}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 232 bytes
Desc: not available
Url : http://mail.pm.org/archives/spug-list/attachments/20020430/de8a64d8/attachment.bin


More information about the spug-list mailing list