順序付けされたハッシュリテラル(2)
http://d.hatena.ne.jp/gfx/20080713/1215918381について
Nishinoさんとid:charsbarさんから同じコメントをいただきました。
Tie::IxHashやTie::LLHash,Tie::DxHashなどが順序付けされたハッシュの実装だそうです。
use 5.010; use Tie::IxHash; tie my %hash, 'Tie::IxHash'; %hash = (H=>1, o=>2, g=>3, e=>4); say keys %hash; # => "Hoge"
確かに希望通りです。ただ,この方法だとリテラルとして書けないのが面倒くさいです。とはいえわざわざVMハックをするまでもないことでした。やりたかったのは以下のようなことなので,単にちょっとしたサブルーチンで十分です。
use 5.010; use Module::Load; sub tie_hash{ my $module = 'Tie::' . shift; load $module; my %hash; tie %hash, $module; %hash = @_; return \%hash; } my $hash = tie_hash IxHash => (H=>1, o=>2, g=>3, e=>4); say keys %$hash; # => "Hoge"
もともと3行掛かっていた処理を1行でできるようになりました。
なお,これはBenchmark::timethese()に渡すコードを順番どおりに表示してほしいからなのでした。