Reputation: 11
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
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