Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > Ключи "многомерного" хэша


Автор: Sadok 8.12.2005, 15:40
Есть у меня хэш вида
Код

$hash{x}{y}{z} = "qwerty";

пытаюсь делать влоб:
Код


foreach ($k1, $k2, $k3) keys %hash {
    print "$k1\n"; #в надеже получить 'x'
    print "$k2\n"; #в надеже получить 'y'
    print "$k3\n"; #в надеже получить 'z'
}

Ругается, конечно, на синтаксис. Пусть. Задача у меня другая: получить в переменные наименования ключей. Никак не могу понять perldoc что?

Автор: Kiber_rat 8.12.2005, 16:48
Опиши задачу поподробнее. Не могу понять что ты хочешь получить.
Код
$hash{x}{y}{z} = "qwerty";
тут ты задаешь значение qwerty для ключа z анонимного хэша, ссылка на который хранится ключе y анонимного же хэша, ссылка на который хранится в ключе x хэша %hash.
Давай распишем по другому твой %hash
Код
%hash = (
    x => {
        y => {
            z => 'qwerty',
        }
    }
)
- это то что ты хотел задать? Потому что у тебя в %hash есть только один ключ (х) и, следовательно, задасться у тебя только значение $k1 в котором будет лежать ссылка на хэш.

Автор: Sadok 9.12.2005, 11:26
Kiber_rat
Да, так и есть (посмотрел через Комодо). smile Это лечится или мне придумывать другой алгоритм?

Автор: Kiber_rat 9.12.2005, 11:48
Это зависит от того, что тебе нужно smile Опиши какие данные ты собираешься хранить, отсюда и будем плясать. Многомерный хэш не слишком часто нужен. Возможно тебе подойдет массив хэшей или что-то подобное.

Автор: sharq 9.12.2005, 17:16
Sadok что такое $hash{x}{y}{z}?
Это хеш хешей хешей. Для того, чтобы пробежать по каждому хешу, нужен цикл!

Поэтому:
Код

# вместо хеша используем ссылку на хеш 
my $hash = { 
     'x' => {
        'y' => {
            'z' => 'qwerty',
        },
    },
};

while (my ($key, $hash_x) = each %$hash) {
  print "$key:\n";
  while (my ($key2, $hash_y) = each %$hash_x) {
    print "  $key2:\n";
    while (my ($key3, $value3) = each %$hash_y) {
      print "    $key3: $value3\n";
    }
  }
}


По кажому хешу, а точнее ссылки на хеш, пробежались циклом.

Чтобы посмотреть все содержимое хеша и не бегать по каждой структуре, можно делать так:
Код

use Data::Dumper;

print Dumper($hash);


Почитай про использование ссылок в perl + perldoc perlreftut.

smile


Автор: korob2001 9.12.2005, 20:56
О многомерных хешах так же можешь почитать эту тему:
http://forum.vingrad.ru/index.php?showtopic=50549

Автор: Sadok 10.12.2005, 16:07
sharq, korob2001

Всем спасибо. Разобрался.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)