Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ключи "многомерного" хэша, Получить имя ключа 
:(
    Опции темы
Sadok
Дата 8.12.2005, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 2.11.2004

Репутация: нет
Всего: 2



Есть у меня хэш вида
Код

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

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


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

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

Это сообщение отредактировал(а) Sadok - 8.12.2005, 15:42
PM   Вверх
Kiber_rat
Дата 8.12.2005, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MACMANIAC
**


Профиль
Группа: Участник
Сообщений: 276
Регистрация: 18.4.2002
Где: Ashdod, Israel

Репутация: нет
Всего: 9



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


--------------------
Best regards!                                                             
@..@_____Ku6ep
=*=______\______KPbIC
Код
print join "",map{chr}(split/(\w{2})/,hex(int(2175.57302796298**2)))
PM WWW ICQ Skype Jabber YIM   Вверх
Sadok
Дата 9.12.2005, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 2.11.2004

Репутация: нет
Всего: 2



Kiber_rat
Да, так и есть (посмотрел через Комодо). smile Это лечится или мне придумывать другой алгоритм?
PM   Вверх
Kiber_rat
Дата 9.12.2005, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MACMANIAC
**


Профиль
Группа: Участник
Сообщений: 276
Регистрация: 18.4.2002
Где: Ashdod, Israel

Репутация: нет
Всего: 9



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


--------------------
Best regards!                                                             
@..@_____Ku6ep
=*=______\______KPbIC
Код
print join "",map{chr}(split/(\w{2})/,hex(int(2175.57302796298**2)))
PM WWW ICQ Skype Jabber YIM   Вверх
sharq
Дата 9.12.2005, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 3
Всего: 28



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




--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
korob2001
Дата 9.12.2005, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



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


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Sadok
Дата 10.12.2005, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 2.11.2004

Репутация: нет
Всего: 2



sharq, korob2001

Всем спасибо. Разобрался.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0499 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.