2

ハッシュに関する情報を保存することは可能ですか? つまり、通常の方法でハッシュに情報を追加せずに、キーや値などに影響を与えるということです。

問題は、私は twod_array をハッシュに読み込んでいますが、ハッシュなどをどのようにトラバースするかに影響を与えることなく、元の配列内に順序を格納したいと考えています.

たとえば、次のようにします。

my @the_keys=keys %the_hash;

ハッシュの順序に関する情報を返すべきではありません。

ハッシュ内にメタデータを保存する方法はありますか?

4

2 に答える 2

4

tieメカニズムを使用して任意のメタデータを保存できます。標準のハッシュインターフェイスに影響を与えないパッケージストレージの最小限の例:

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'
于 2012-07-02T12:29:06.787 に答える
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'
于 2012-07-02T11:18:11.080 に答える