![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
loginn |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
loginn |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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 = \$_ } } Можно ли получить адрес строки самого ключа без данного цикла? Чтобы при вставки новой строки в хэш не создавать заново массив ключей и не перебирать его в поисках данной строки, т.к. это достаточно накладно при большом количестве длинных строк. |
|||
|
||||
Jimy |
|
||||||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 4.7.2010 Репутация: нет Всего: 3 |
Перечитал 2 раза. В обоих сообщениях ты хочешь получить то, что изначально известно.
Если получить значение легко, то ключ должно быть получить еще легче, разве нет? Он известен заранее и именно по нему получается значение из хэша.
Да, это 'str3'. И этот цикл не имеет смысла, его стоит заменить на
Значение в $ref будет какое же как и при выполнении приведенного цикла.
Или имелось ввиду что-то другое? |
||||||||||
|
|||||||||||
loginn |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 22.12.2010 Репутация: нет Всего: нет |
Я понял Ваш ответ, но он немного о другом.
Смотрите, допустим, $new_line = 'strinstringstrinstringstrinstringstrinstringstrinstringstrinstringstrinstringstrinstringstrinstringstrinstringstrinstringstrinstringstrinstring' тогда мы делаем так: $h{$new_line} = 0; теперь строка, которая была в $new_line была добавлена в хэш. если я сделаю так: $ref = \$new_line, то рискую, что когда в $new_line окажется новая строка, то и $ref будет так же на нее указывать... а мне нужно, чтобы он указывал на саму строку, которая является ключом хэша. А все потому, что строку эту нужно хранить только в одном месте, в том, где она хранится в качестве хэша. Но получить доступ к отдельному ключу хэша я не знаю как, кромt как ко всем сразу через keys %h. |
|||
|
||||
loginn |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 22.12.2010 Репутация: нет Всего: нет |
насчет if (!defined $h{'str3'}) {
... } проверяет, присвоено ли что-либо ключу. чтобы проверить есть ключ в хэше или нет, используется exists |
|||
|
||||
Jimy |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 4.7.2010 Репутация: нет Всего: 3 |
Вероятно имеет место неправильный выбор структуры для хранения данных. Если не подходят длинные строки в качестве ключей, то можно вместо них использовать, например, SHA-хэш строки. В зависимости от того, для чего используется $ref, возможно, логичнее в нем хранить ссылку на значение. |
|||
|
||||
loginn |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 22.12.2010 Репутация: нет Всего: нет |
Т.е. вычислять SHA1/MD5 от строки, затем это значение использовать как ключ для вставки в хэш и с этим ключом ассоциировать строку, чтобы не потерять значение строки.
Но не слишком ли дорого будет на каждый лукап строки в хэше вычислять предварительно SHA1/MD5? ИМХО, не highload решение. |
|||
|
||||
Jimy |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 4.7.2010 Репутация: нет Всего: 3 |
В вопросе не содержится достаточно информации, чтобы сказать будет это слишком дорого или не слишком. Из вопроса ясно, что критичным является перерасход памяти. Хэш строки, вероятно, занимает меньше места чем некая "длинная строка" из условия и поэтому позволяет экономить память. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |