mirka mirkab2b
mirka mirkab2b

Reputation: 11

Rewrite hash of hash into parallel arrays

I need rewrite the values from a hash of hashes into parallel arrays.

Specifically, I want to transform

my %cars;
$cars{123} = { owner => "Mark",   color => "black", maxspeed  = "260" };
$cars{124} = { owner => "Jason",  color => "red",   maxspeed => "230" };
$cars{125} = { owner => "Sumaya", color => "pink",  maxspeed => "200" };

into

my @owners    = ( "Mark",  "Jason", "Sumaya" );
my @colors    = ( "black", "red",   "pink"   );
my @maxspeeds = ( "260",   "230",   "200"    );

Upvotes: 0

Views: 56

Answers (1)

ikegami
ikegami

Reputation: 386706

This can be achieved using

my @ids       = keys(%cars);
my @owners    = map { $_->{ owner    } } @cars{@ids};
my @colors    = map { $_->{ color    } } @cars{@ids};
my @maxspeeds = map { $_->{ maxspeed } } @cars{@ids};

or

my (@ids, @owners, @colors, @maxspeeds);
while (my ($id, $car) = each(%$cars)) {
   push @ids,       $id;
   push @owners,    $car->{owner};
   push @colors,    $car->{colors};
   push @maxspeeds, $car->{maxspeeds};
}

This is a weird request because one normally avoids parallel arrays because using them leads to more complicated code.

Upvotes: 3

Related Questions