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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить адрес ключа хэша? 
:(
    Опции темы
loginn
Дата 22.3.2014, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нужно хранить много сдлинных строк. Так же с каждой строкой должен быть ассоциирован глобальный и много разных локальных каунтеров.

Я думаю делать так:
1. Создать единый хэш для всех строк: %long_string и с каждой строкой будет ассоциирован глобальный каунтер.
2. Из других мест ссылаться на сам ключ, чтобы вести другие "локальные" каунтеры для этой строки. НО, тогда требуется хранить адрес самой строки, которая является ключом хэша. Адрес значения ключа получить легко: \$long_string{'STRING_1'} = 889. НО КАК получить адрес самой строки, которая является ключом в хэше (т.е. адрес 'STRING_1')? 

Делать так: $long_string{'STRING_1'} = (889, 'STRING_1') - не катит, т.к. строка будет дублироваться и память будет расходваться в 2 раза больше.


P.S. Заранее благодарю за ответ.

Это сообщение отредактировал(а) loginn - 22.3.2014, 13:29
PM MAIL   Вверх
loginn
Дата 22.3.2014, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Т.е. суть вопроса можно переформулировать так:
#!/usr/bin/perl -w

$h{'str1'} = 1;
$h{'str2'} = 2;
$h{'str3'} = 3;
$h{'str4'} = 4;
$h{'str5'} = 5;


foreach (keys %h) {
  if ($_ eq 'str3') {
    $ref = \$_
  }
}

Можно ли получить адрес строки самого ключа без данного цикла? Чтобы при вставки новой строки в хэш не создавать заново массив ключей и не перебирать его в поисках данной строки, т.к. это достаточно накладно при большом количестве длинных строк.

PM MAIL   Вверх
Jimy
Дата 22.3.2014, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Перечитал 2 раза. В обоих сообщениях ты хочешь получить то, что изначально известно.
Цитата

Адрес значения ключа получить легко: \$long_string{'STRING_1'} = 889. НО КАК получить адрес самой строки, которая является ключом в хэше (т.е. адрес 'STRING_1')? 

Если получить значение легко, то ключ должно быть получить еще легче, разве нет? Он известен заранее и именно по нему получается значение из хэша.

Цитата

foreach (keys %h) {
  if ($_ eq 'str3') {
    $ref = \$_
  }
}
Можно ли получить адрес строки самого ключа без данного цикла?

Да, это 'str3'. И этот цикл не имеет смысла, его стоит заменить на
Код

$ref = \'str3';

Значение в $ref будет какое же как и при выполнении приведенного цикла.

Цитата

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

Код

if (!defined $h{'str3'}) {
...
}


Или имелось ввиду что-то другое?
PM   Вверх
loginn
Дата 22.3.2014, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я понял Ваш ответ, но он немного о  другом.


Смотрите, допустим, $new_line = 'strinstringstrinstringstrinstringstrinstringstrinstringstrinstringstrinstringstrinstringstrinstringstrinstringstrinstringstrinstringstrinstring'

тогда мы делаем так: $h{$new_line} = 0;

теперь строка, которая была в $new_line была добавлена в хэш.

если я сделаю так: $ref = \$new_line, то рискую, что когда в $new_line окажется новая строка, то и $ref будет так же на нее указывать... а мне нужно, чтобы он указывал на саму строку, которая является ключом хэша.

А все потому, что строку эту нужно хранить только в одном месте, в том, где она хранится в качестве хэша. Но получить доступ к отдельному ключу хэша я не знаю как, кромt как ко всем сразу через keys %h.
PM MAIL   Вверх
loginn
Дата 22.3.2014, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



насчет if (!defined $h{'str3'}) {
...
}
проверяет, присвоено ли что-либо ключу.

чтобы проверить есть ключ в хэше или нет, используется exists
PM MAIL   Вверх
Jimy
Дата 23.3.2014, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(loginn @ 22.3.2014,  21:19)
а мне нужно, чтобы он указывал на саму строку, которая является ключом хэша.

А все потому, что строку эту нужно хранить только в одном месте, в том, где она хранится в качестве хэша. Но получить доступ к отдельному ключу хэша я не знаю как, кромt как ко всем сразу через keys %h.

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

PM   Вверх
loginn
Дата 23.3.2014, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Т.е. вычислять SHA1/MD5 от строки, затем это значение использовать как ключ для вставки в хэш и с этим ключом ассоциировать строку, чтобы не потерять значение строки.
Но не слишком ли дорого будет на каждый лукап строки в хэше вычислять предварительно SHA1/MD5? 

ИМХО, не highload решение.
PM MAIL   Вверх
Jimy
Дата 23.3.2014, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(loginn @ 23.3.2014,  18:06)
Но не слишком ли дорого будет на каждый лукап строки в хэше вычислять предварительно SHA1/MD5? 

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


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

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


 




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


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

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