[Petal] Looping through a hash

Steve Purkis spurkis at mkdoc.com
Thu Sep 4 18:10:20 BST 2003


On Thursday, September 4, 2003, at 03:00  pm, William McKee wrote:

> Hi all,
>
> Although the docs do not indicate that loops can only be done on 
> arrays,
> my testing shows that Petal will die if you try to perform a loop over
> a hash (e.g., "Error: Not an ARRAY reference at (eval 10) line 94.").
>
> Is there a way to have Petal loop over the keys of a hash? or must I
> convert the hash into an array?

You could write a modifier, and use it with petal:repeat:

	package Petal::Hash::Keys;
	use strict;
	use warnings;
	sub process {
	    my ($self, $hash, $args) = @_;
	    my $result = $hash->fetch( $args );
	    die "$args is not a hash!" unless ref($result) eq 'HASH';
	    return [ keys %$result ];
	}
	1;

And then:
	<span petal:repeat="key keys: $some_hash">
		do something with $key ...
	    will this get the value: ${some_hash/$key} ?
	</span>

If you want both a list of key/value pairs, you could write 
Petal::Hash::Each to do something like:

	    return [ map { { key => $_, val => $result->{$_} } } keys %$result 
];

And then:
	<span petal:repeat="item each: $some_hash">
	    key: $item/key
	    val: $item/val
	</span>

I've got a few little plugins like this that might be good candidates 
for a Petal::Utils package at some stage.

hth,
-Steve



More information about the Petal mailing list