2012-07-02 3 views
2

Возможно ли хранить информацию о хеше, в нем? И под этим я имею в виду, не добавляя информацию к хешу обычным способом, что повлияло бы на ключи, значения и т. Д.Perl hash metainformation

То, что я читаю twod_array в хэш, но хотел бы сохранить заказ в пределах исходный массив, не затрагивая, как один проходит через хэш и т.д.

так, например:

my @the_keys=keys %the_hash; 

не должна возвращать информацию о порядке хэш.

Есть ли способ хранить метаданные в хэше?

ответ

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' 
+0

«' ключи% the_hash' должны ** ** не возвращать информацию о порядке хэш », нет? –

+0

Я полагаю, что OP означает, что мы не должны хранить информацию о заказе внутри хэша как своего элемента так или иначе. В противном случае это не имеет смысла - как мы можем знать, что хэш-код заказался, если не путем повторения его ключей/значений? – raina77ow

+0

Он не должен возвращать заказ, нет. Предполагается, что ключи в хешах по своей природе беспорядочны. –

4

Вы можете хранить произвольные метаданные с tie mechanism. Минимальный пример с хранения пакета, который делает не влияет на стандартный хэш-интерфейс:

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'