2011-12-07
■Perl5.14でなくても配列操作関数にリファレンスを受け付けさせる
Perl5.14を使ったことのある方*1は、配列やハッシュのための関数群がリファレンスを受け付ける機能の便利さに感動を覚えたのではないかと思いますが、5.14でなくてもこの機能を使えるようにしたかったので、それを可能にするモジュールを作っています。
https://github.com/Cside/List-AcceptReference
use List::AcceptReference qw/:all/; my $arrayref = [1..3]; push $arrayref, 4; unshift $arrayref, 5; pop $arrayref; shift $arrayref; # もちろん通常の配列も受け付ける my @array = 1..3; push @array, 4; unshift @array, 5; pop @array; shift @array;
【追記: 12/07 16:37】
以下が実装済みです。
- pop
- push
- shift
- unshift
- splice
- keys
- values
- each
mapにも手をつけてみたのですが、なぜか CORE::map が勝手に使われてしまう謎の現象にはまってしまい、挫折中です。。。
use List::AcceptReference qw/map/; my @array = (1..3); map { $_ + 1 } @array; #=> CORE::map が呼ばれてしまう!!
今のところは
- pop
- push
- shift
- unshift
- splice
だけですが、この勢いで
- keys
- values
- each
と、それから本家ではサポートしていませんが
- map
- grep
- sort
も(配列|ハッシュ)リファレンスを受け付けるものを作ってみようかなと考えています。
実装にあたりアドバイスをくださった id:Yuichirou さん、ありがとうございました。

参照:オーバーライドできない関数 - だるろぐ跡地 http://d.hatena.ne.jp/foosin/20090403/1238772396