※作成中 [ 2019-10-08 ]
- Hash::Ordered 0.014 - David Golden - metacpan [2019-07-08]
https://metacpan.org/pod/Hash::Ordered
- Perl で順序つきハッシュを使いたい
Hash::Ordered
というものがあったので試してみた
- cpan で入る
$ cpan -i Hash::Ordered
use 5.20.1;
use warnings;
use utf8;
use Data::Dumper 'Dumper';
use Hash::Ordered;
my $oh = Hash::Ordered->new( a => 1 );
say Dumper($oh);
=pod
$VAR1 = bless( [
{ 'a' => 1 },
[ 'a' ],
undef, 0, 0
], 'Hash::Ordered' );
=cut
ハッシュと配列を共に内部に持っている様子。いいね。
say $oh->get( 'a' ); # 1
say $oh->[0]->{'a'}; # 上記構造を見る限りこれと同等
$oh->set( 'a' => 2 ); # $oh->[0]->{'a'} = 2
say $oh->get( 'a' ); # 2
say Dumper($oh);
=pod
$VAR1 = bless( [
{ 'a' => 2 },
[ 'a' ],
undef, 0, 0
], 'Hash::Ordered' );
=cut
say $oh->exists( 'a' ); # 1
say $oh->exists( 'b' ); # '' (zero-length)
my $val = $oh->delete( 'a' );
say $val; # 2
say Dumper($oh);
=pod
$VAR1 = bless( [
{},
[],
undef,
0,
0
], 'Hash::Ordered' );
=cut
キーを指定して削除 → 値が返る。
$oh->push( 'a' => 'あ', 'b' => 'い' );
$oh->push( qw/c う d え/ );
say Dumper($oh);
=pod
$VAR1 = bless( [
{
'a' => "\x{3042}", # あ
'c' => "\x{3046}", # う
'd' => "\x{3048}", # え
'b' => "\x{3044}" # い
},
[
'a',
'b',
'c',
'd'
],
undef,
0,
0
], 'Hash::Ordered' );
=cut
$oh->unshift( qw/C ぅ D ぇ/ );
$oh->unshift( 'A' => 'ぁ', 'B' => 'ぃ' );
say Dumper($oh);
=pod
$VAR1 = bless( [
{
'D' => "\x{3047}",
'd' => "\x{3048}",
'A' => "\x{3041}",
'a' => "\x{3042}",
'B' => "\x{3043}",
'b' => "\x{3044}",
'C' => "\x{3045}",
'c' => "\x{3046}"
},
[
'A',
'B',
'C',
'D',
'a',
'b',
'c',
'd'
],
undef,
0,
0
], 'Hash::Ordered' );
=cut
#### キーのみ, 値のみ, 両方 の配列取得
```perl
my @keys = $oh->keys();
say encode_utf8( join ', ', @keys );
# A, B, C, D, a, b, c, d
my @vals = $oh->values();
say encode_utf8( join ', ', @vals );
# ぁ, ぃ, ぅ, ぇ, あ, い, う, え
my @keyvals = $oh->as_list();
say encode_utf8( join ', ', @keyvals );
# A, ぁ, B, ぃ, C, ぅ, D, ぇ, a, あ, b, い, c, う, d, え
my ($key, $value) = $oh->pop();
say encode_utf8( sprintf "poped: key='%s', value='%s'", $key, $value);
($key, $value) = $oh->shift();
say encode_utf8( sprintf "shifted: key='%s', value='%s'", $key, $value);
say encode_utf8( sprintf "after: %s", join( ', ', $oh->as_list()) );
=pop
poped: key='d', value='え'
shifted: key='A', value='ぁ'
after: B, ぃ, C, ぅ, D, ぇ, a, あ, b, い, c, う
=cut
my $iter = $oh->iterator();
my $n = 0;
while( my ( $k, $v ) = $iter->() ) {
say encode_utf8( sprintf "[%d] key='%s' value='%s'", $n++, $k, $v);
}
=pop
[0] key='B' value='ぃ'
[1] key='C' value='ぅ'
[2] key='D' value='ぇ'
[3] key='a' value='あ'
[4] key='b' value='い'
[5] key='c' value='う'
=cut