List::Utils::Nest作りました

簡単なデータの分析や下処理にRやperlJavaScriptなど手元にあるものや、すぐ視覚化してみたいかどうかで、適当に選んで使っています。 d3.jsのd3.nestが大変使いやすくperlでも使いたかったので作りました。

使い方

use List::Utils::Nest;
my $sample = [
    {userid => 1, itemid => 1, quantity => 3},
    {userid => 1, itemid => 4, quantity => 3},
    ...
    {userid => 3, itemid => 2, quantity => 3},
    {userid => 3, itemid => 4, quantity => 3},
    {userid => 3, itemid => 4, quantity => 1},
];

my $entries = List::Utils::Nest->new($sample)->key('userid')->entries();

# [{
#     values => [
#       {userid => 1, itemid => 1, quantity => 3},
#       {userid => 1, itemid => 4, quantity => 3}
#     ],
#     key => 1
#   },
#   ...
#   {
#     values => [
#       {userid => 3, itemid => 2, quantity => 3},
#       {userid => 3, itemid => 4, quantity => 3},
#       {userid => 3, itemid => 4, quantity => 1}
#     ],
#     key => 3
#   }
# ]

というように、nest化することができます。超便利! nestは「new List::Utils::Nest」のaliasです

入れ子

入れ子にできます!

my $entries = nest($sample, delimiter => ",")->key('userid')->key('itemid')->entries();

複数キー

複数のキーを使うこともできます

my $entries = nest($sample)->key('userid', 'itemid')->entries();

デリミタ

複数のキーを使った時のデフォルトデリミタは「_____」ですが、変更できます

my $entries = nest($sample, delimiter => ",")->key('userid', 'itemid')->entries();

キーをサブルーチンで作る

keyにサブルーチンを渡すと、第1引数にオブジェクトを取れます。これを好きなように嬲って(例えば、日とか曜日とか、時間帯とか)返せば、それをキーとして使えます