Perl哈希元信息

时间:2012-07-02 11:14:35

标签: perl hash metadata

是否可以存储有关哈希的信息? 我的意思是,不用普通方式将信息添加到哈希中,这会影响键,值等。

我正在读取一个twod_array到一个哈希,但是想在原始数组中存储顺序,而不会影响遍历哈希等的方式。

所以例如:

my @the_keys=keys %the_hash;

不应该返回有关散列顺序的信息。

有没有办法在散列中存储元数据?

2 个答案:

答案 0 :(得分:4)

您可以使用tie mechanism存储任意元数据。包含 not 的包存储的最小示例会影响标准哈希界面:

package MetadataHash;
use Tie::Hash;
use base 'Tie::StdHash';
use Scalar::Util qw(refaddr);
our %INSERT_ORDER;
sub STORE {
    my ($h, $k, $v) = @_;
    $h->{$k} = $v;
    push @{ $INSERT_ORDER{refaddr $h} }, $k;
}
1;

package main;
tie my %h, 'MetadataHash';
%h = ( I => 1, n => 2, d => 3, e => 4 );
$h{x} = 5;
# %MetadataHash::INSERT_ORDER is (9042936 => ['I', 'n', 'd', 'e', 'x'])
print keys %h;
# 'enIxd'

答案 1 :(得分:2)

嗯,我想总是可以使用Tie::Hash::Indexed

use Tie::Hash::Indexed;

tie my %hash, 'Tie::Hash::Indexed';
%hash = ( I => 1, n => 2, d => 3, e => 4 );
$hash{x} = 5;

print keys %hash, "\n";    # prints 'Index'
print values %hash, "\n";  # prints '12345'