List to hash which have unique keys
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
eg
lib/List
t
.gitignore
.travis.yml
Build.PL
Changes
LICENSE
META.json
README.md
cpanfile
minil.toml

README.md

Build Status

NAME

List::ToHash - List to hash which have unique keys

SYNOPSIS

use List::ToHash qw/to_hash/;
my @users = (
    {
        id => 1,
        value => 'foo',
    },
    {
        id => 2,
        value => 'bar',
    },
);
my $x = to_hash { $_->{id} } @users;
# {
#     "1" => {
#        "id" => 1,
#        "value" => "foo"
#     },
#     "2" => {
#        "id" => 2,
#        "value" => "bar"
#     }
# };

DESCRIPTION

List::ToHash provides fast conversion list to hash by using lightweight callback API.

map is so simple and good for readability. I usually use this in this situation.

my $x = +{map { ($_->{id} => $_) } @users};

List::Util::reduce is a little tricky however it works faster than map.

my $x = List::Util::reduce { $a->{$b->{id}} = $b; $a } ({}, @ARRAY);

for is lame... Look, it spends two lines.

my $x = {};
$x->{$_->{id}} = $_ for @users;

List::ToHash::to_hash is a quite simple way, more faster.

my $x = List::ToHash::to_hash { $_->{id} } @users;

BENCHMARK

List::ToHash is the fastest module in this benchmark eg/bench.pl.

Benchmark: running for, map, reduce, to_hash for at least 3 CPU seconds...
       for:  3 wallclock secs ( 3.18 usr +  0.01 sys =  3.19 CPU) @ 19303.13/s (n=61577)
       map:  3 wallclock secs ( 3.13 usr +  0.02 sys =  3.15 CPU) @ 13437.46/s (n=42328)
    reduce:  3 wallclock secs ( 3.20 usr +  0.02 sys =  3.22 CPU) @ 18504.66/s (n=59585)
   to_hash:  4 wallclock secs ( 3.12 usr +  0.01 sys =  3.13 CPU) @ 26635.78/s (n=83370)
           Rate     map  reduce     for to_hash
map     13437/s      --    -27%    -30%    -50%
reduce  18505/s     38%      --     -4%    -31%
for     19303/s     44%      4%      --    -28%
to_hash 26636/s     98%     44%     38%      --

FUNCTIONS

  • my $hashref = to_hash { ... } @list;

    Returns the hash reference of given @list for which have the key returned by the block.

      my $id_to_user_row = to_hash { $_->{id} } @user_rows;
    

LICENSE

Copyright (C) Takumi Akiyama.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

AUTHOR

Takumi Akiyama <t.akiym@gmail.com>