おそらくはそれさえも平凡な日々

List::Util#pairmap|pairkeys が便利 (Re: ハッシュっぽい配列からkeysだけ取り出したい) 追記有り

http://hisaichi5518.hatenablog.jp/entry/2013/03/25/151942

Github::Hooks::Manager作ってるときに、HTML::Shakanに手を入れたりしてて、その流れでHTML::Shakanのオーナーになったりしてたのですが、その際に知った List::Util#pairmapが便利だった。

PSGIのSPECでも使われていたりしていることも関連しているのか、最近key valueのペアが入った配列を見かける頻度が上がってきたように思います。

で、そういうのを上手く扱う方法が無いのかなーとかみんな思っていたかとおもうのですが、灯台下暗し、List::Utilpairmap()ってのがありました。以下の様な感じで使います。

my @results = pairmap {[$a, $b]} qw/1 1 2 2 3 3 4 4/;

与えられたリストから、値を2つづつ取り出して、ブロックの中で、$a$bに代入してくれているという具合です。例えばキーの部分だけ取り出したい場合は、以下の要領でOKです。

my @keys = pairmap {$a} qw/1 1 2 2 3 3 4 4/;

これを踏まえてタイトルにもある @hisaichi5518 君のブログのベンチに追記して回すと以下のとおりです。速い!最高!

$ perl pairmap.pl
10
                  Rate   no copy      copy lestrrat-san tokuhirom-san songmu-san
no copy       214824/s        --      -12%         -48%          -48%       -60%
copy          242811/s       13%        --         -41%          -41%       -54%
lestrrat-san  411162/s       91%       69%           --           -0%       -23%
tokuhirom-san 411481/s       92%       69%           0%            --       -23%
songmu-san    531350/s      147%      119%          29%           29%         --

今目の前でぶつかり稽古みてて、List::Util#pairmap 使えばいいのになーとか思ってる。

ちなみに、標準モジュールだから、cpanfileに書かなくてもOKやーとか思ってると、pairmapが入ったのは今年だったりするのでちゃんと1.32以降のバージョンを記載しないといけ無いので注意。僕はそれを怠って、HTML::ShakanのテストをTravisを盛大にこかしました。Travis最高便利!

追記

ブコメでkitsさんに、この用途だったらpairkeysってのが別であることを教えていただいたので、再度ベンチ。

圧倒的に速い!

created at
last modified at

2013-11-28T10:31:16+0900

comments powered by Disqus