Michael Kavanagh wrote:
> 
> Hi there,

Hello,

> I've got a hash that has keys which contain either
> - array references
> - scalar values
> 
> for example:
> @values = (12398712984, 19286192879);
> $hashofarrays{'family'}{'arrayref'} = \@values;
> $hashofarrays{'family'}{'scalar'} = 12938712938;

It would be simpler if you stored all the values as arrays instead of
scalars.

$hashofarrays{'family'}{'arrayref'} = [ 12398712984, 19286192879 ];
$hashofarrays{'family'}{'scalar'}   = [ 12938712938 ];


> I'm trying to map the hash into another array that would just be a flattened
> list of values. (a combination of the scalar values and the individual array
> values)
> 
> I'm iterating through each key in the hash and then using 'map' on the key
> to do this at the moment.
> 
> I can get it to work for all the array references by mapping on the
> de-referenced array ref, like this:
>      map { push @items,  $_  }  ( @{$hashofarrays{'family'}{'arrayref'} } );

If you have map in a void context you should be using for instead.


> But that ignores all the scalar values...it only gets the keys that contain
> array references.
> 
> To get the scalars, the following works:
>      map { push @items,  $_  }  ( $hashofarrays{'family'}{'scalar'} );
> 
> Is there an elegant / idiomatic way to do both at once?
> I'm guess I could do it using a conditional that checks the hash value and
> executes one of the above statements as I iterate through the hash keys, but
> if theres a better way...


To create the array:

my @items = map { ref ? @{$hashofarrays{'family'}{$_}} :
                          $hashofarrays{'family'}{$_}
                 } keys %{$hashofarrays{'family'}};

To add to an existing array:

push @items, map { ref ? @{$hashofarrays{'family'}{$_}} :
                           $hashofarrays{'family'}{$_}
                  } keys %{$hashofarrays{'family'}};

Or using for:

push @items, ref ? @{$hashofarrays{'family'}{$_}} :
                     $hashofarrays{'family'}{$_}
          for keys %{$hashofarrays{'family'}};

These assume that the value is either an array reference or a scalar.


John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to