2011-12-29 7 views
1

Я отказался от идеи использовать это для своей программы, но я заинтригован, потому что я не нашел ответа на вопрос о том, как это сделать. В принципе, если я построить что-то вроде следующего (Пожалуйста, простите мое форматирование, если следующий не появляется в порядке):Perl Синтаксис: Hash of HashReferences of HashReferences

  • A = |num_key => hashref_a|,
  • hashref_a является хэш-ссылка на a = |string_keys => hashref_b|,
  • hashref_b хэш ссылка на b = |num_key, num_value|.

Итак, как вы видите, первый уровень - это хеш с ключами, являющимися числами, и его значения являются ссылками на другой хеш, который, в свою очередь, является хэшем, чьи ключи являются строками, связанными со значениями, которые снова являются хеш-ссылками (эти являются, однако, хэшами только ключей и цифр).

Теперь, как я могу получить доступ b (весь список ключей или только значение для соответствующего ключа) дана num_key для первого хэша и конкретный string_key для второго хэша.

Я очень надеюсь, что смог четко ответить на вопрос!

ответ

3

Если я понял ваш запрос правильно:

my %hash = (num_key => { string_keys => { num_key => 1.234 } }); 

Или:

my %hash_b = (num_key => 1.234); 
my %hash_a = (string_keys => \%hash_b); 
my %hash_z = (num_keys => \%hash_a); 

Ммм ... после редактирования вопроса, я думаю, вы спрашиваете, как получить доступ к значениям, а не как их построить.

my $value = $hash{$num_key}->{$string_key}->{num_key}; 

Здесь немного, Я использовал $num_key, но единственным допустимым значением для данных данных является «num_key»; аналогично $string_key и «string_keys». Однако стрелки являются ключом к обозначению.

2
my %hash = (3 => { "hello" => { 18 => 583 } }); 

print $hash{3}->{"hello"}->{18}; 
# ==> 583 

EDIT Я вижу @JonathanLeffler сделал почти такой же ответ, но я оставлю мое здесь в качестве дополнения к его, как работоспособный демо его объяснения.

0
%hash = (
    one => { a => 10, b => 20 }, 
    two => { c => 30, d => 40 } 
); 

&function(\%hash); 

sub function { 
    my $hash = shift; 

    $hash->{two}->{d} = 50; # changes 'd' 
} 

Вы можете идти так глубоко, как вы хотите здесь, с хешей хешей хешей. Надеюсь, что помогает ...

+2

Вы не должны использовать амперсанд для вызова функций, если не знаете, что он делает, и что он делает, это то, что вы хотите сделать (это редко бывает). – tadmc