順序付けされたハッシュリテラル(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()に渡すコードを順番どおりに表示してほしいからなのでした。