![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| AlexanderI |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 230 Регистрация: 9.7.2004 Репутация: 2 Всего: 3 |
Помогите создать условие.
У меня есть массив: @massiv = qw(4 10 16 20); Каким образом создать условие так, чтобы проверялось сразу принадлежность каждого значения массива ? т.е например:
Это сообщение отредактировал(а) AlexanderI - 20.7.2006, 10:35 --------------------
Магазин детских игрушек | Авто ВАЗ |
|||
|
||||
| Nab |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
неее, пользуйся лучше хешем...
или вот так
Тут вкралась ошибочка, смотрите топик ниже Правильно вот так:
Хотя в данном конкретном случае это никак не влияет, мы проверяем существование ключа а не его истиннось, но ради принципа всеже этот вариант вернее... Это сообщение отредактировал(а) Nab - 17.8.2006, 12:56 -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
||||
|
|||||
| Throne |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 10.5.2006 Репутация: нет Всего: 2 |
В крайнем случае можно изобразить что-то типа
Это сообщение отредактировал(а) Throne - 20.7.2006, 15:45 --------------------
Компьютер — это наредкость тупая вещь, но считает с феноменальной скоростью. |
|||
|
||||
| DiverD |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 225 Регистрация: 14.9.2005 Где: Белорусь Репутация: 1 Всего: 2 |
еще как вариант с форейчем:
--------------------
[ FreeBSD & pERL p0WER eVERY dAY ] |
|||
|
||||
| Ramirez |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 18.1.2005 Где: Moscow, ExUSSR Репутация: 4 Всего: 5 |
вот еще вариантец
Это сообщение отредактировал(а) Ramirez - 21.7.2006, 10:19 |
|||
|
||||
| lanD |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 5.6.2006 Репутация: нет Всего: нет |
Почитай про логические операторы
|
|||
|
||||
| igorold |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 22.12.2005 Где: Россия->Урал-& gt;Миасс Репутация: 3 Всего: 17 |
это из другой оперы - это ты проверяешь определен ли энный элемент массива, где эн=$cifra -------------------- ... у семи нянек 14 сисек ... Putin here, Putin there, Putin almost everywhere! |
|||
|
||||
| sharq |
|
|||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 23 Всего: 28 |
AlexanderI,
-------------------- [color=gray]There's More Than One Way To Do It[/color] |
|||
|
||||
| Nab |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
;) -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
| sharq |
|
|||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 23 Всего: 28 |
Nab, т.е. в твоем варианте прокатит:
$cifra = 4, а какой-нить элемент массива @massiv 345 или 4me -------------------- [color=gray]There's More Than One Way To Do It[/color] |
|||
|
||||
| Nab |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Ну вот началось
я так и знал что начнеться блин и в праздник обижают все знают как помочь беде ну ладно, так и быть скажу
или
-------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
||||
|
|||||
| Danissimo |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 14.8.2006 Где: Санкт-Петербург Репутация: 1 Всего: 1 |
2 Nab: Переведи, плз, 2-ю строчку |
||||
|
|||||
| Nab |
|
||||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Ууу, ее сложно в двух словах объяснить, но я попытаюсь В левой части выражения мы формируем срез хеша предсталенный в виде массива. И каждому элементу которого в правой части присваиваем 1. Срез хеша это приблизительно вот так:
Так как нас интересует присваивание то этот срез хеша попадает в левую часть. В правую попадает вот такое выражение:
оператор x - это повторитель, он повторяет элемент (число, строку) указанный как левый операнд... правый операнд определяет количество этих самых элементов. В нашем случае, это массив, который в скалярном контексте возвращает количество своих элементов. Вообще это один из самых простых способов заполнить хеш или массив повторяющимся или дефолтным значением. Я не скажу что это очень сложно, но осваивается с трудом Этот способ хорошо применим когда нужно перевернуть хеш, то есть поменять местами ключи и значения...
Конечно при одинаковых значениях элемент может потеряться, но какой именно, эт боюсь не скажу Ну вот вроде и все, надеюсь понятно объяснил Если что спрашивайте... Это сообщение отредактировал(а) Nab - 9.9.2006, 01:04 -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
||||||||||||
|
|||||||||||||
| Danissimo |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 14.8.2006 Где: Санкт-Петербург Репутация: 1 Всего: 1 |
Супер!!!
1. Правильно я понимаю, что
2. Про 1 x @mass я так и думал. Тока не понятно, зачем? Почему просто не сказать @{%hash}{@mass} = 1;? 3. Где написано, что в конструкции @{%hash}{@mass} сначала выполняется %hash{@mass}, а затем уже результат преобразовывается к массиву (или списку)? 4. Наскока я мог понять из прочтенного, список и массив -- разные вещи. (1, 2, 3) -- список, @x = (1, 2, 3) -- массив, в который скопированы элементы списка. Это верно? 5. Меня удручает, что не могу найти четких правил о семантике языка. Например, где однозначно говорится, в чем отличия в интерпретации @%hash{@mass} и @{%hash}{@mass}. Где? Если не сложно, конечно =) |
|||
|
||||
| Nab |
|
||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Так, сразу приношу извинения кого ввел в заблуждение:
Конструкция '1 x 10' создаст строку из десяти единичек. В нашем же случае нужны отдельные элементы, посему их нужно екранировать... Вот верный код:
Нет не правильно, давай ты хотя бы сначала попробуешь запустить, то что пишеш а потом спрашивать про аналогичность....
Аналогично предыдущему... Сначала самому проверить, а потом писать. С учетом того что я тоже ошибся
С чего ты это взял? Эта конструкция вообще не верна. Нет Аналогично первому, сначала проверить на жизнеспособность а потом писать... Семантика перла многовариантна, это фича Купи LamaBook И очень рекомендую Perl CookBook... Как раз в ней это все есть.... -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
||||||||||
|
|||||||||||
| Ramirez |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 18.1.2005 Где: Moscow, ExUSSR Репутация: 4 Всего: 5 |
Замечательно. По-моему, посты товарища Nab'a вполне достойны размещения в каком нить FAQ.
Вот кстати, иногода бывает такая ситуация:
т.е. из списка надо сделать хеш где значение ключа равно его(ключа) имени. мне кажется должен быть более красивый вариант, без foreach... |
|||
|
||||
| Nab |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Спасибо конечно А по существу, то, наверно вот так :
-------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
||||
|
|||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Ещё, как вариант:
-------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| sharq |
|
|||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 23 Всего: 28 |
korob2001, отличный вариант! Супер!
-------------------- [color=gray]There's More Than One Way To Do It[/color] |
|||
|
||||
| amg |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Нравится мне этот форум! Есть над чем подумать.
Вот, например, здесь предложили несколько вариантов решения практически важной задачи: выяснить, присутствует ли в списке данный элемент. Мне часто приходится иметь дело с огромными списками, поэтому я эти варианты поисследовал на предмет эффективности. Привожу результаты, может, кому-нибудь еще будет интересно.
Результаты:
Я для себя запомню два варианта: "korob2001" - совершенно неожиданный, но очень эффективный, и "Nab1" - не быстрый, но зато не требующий дополнительной памяти. |
||||
|
|||||
| Nab |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
amg, ты манияк от перла
Кстати мне не понятны результаты вариантов diverd и sharq, они по идее аналогичны моему, но отжирают памяти порядочно Конечно они быстрее, но ... Видно какое-то оптимизирующее кеширование применяется... И похоже что одинаковое. Это сообщение отредактировал(а) Nab - 13.9.2006, 03:57 -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
| Nab |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Кстати в моем первом варианте, вопрос не до конца продуман
Ведь в реальности получается что все время потрачено на заполнение и конвертирование одной формы списка в другую, хеш. Хотя у большинства это было просто заполнение массива. Я бы наверно предпочел сразу формировать хеш а не первоначальный список, но идея даже не в этом... Так как в список уникальных значений всего 4 то хеш в конечном итоге получиться всего из 4 элементов, и поиск по нему будет мизерно быстр Вариант 1
Вариант 2
можно пргнать с уникальным списком все варианты -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
||||||
|
|||||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Ага, когда компутер сначала надолго замолкает, а потом начинает молотить диском, впадая в глухой своп, поневоле станешь оптимизатором.
Мне вот тоже непонятно, почему вариант "Nab1" не требует памяти, хотя, на первый взгляд, должен, а "diverd" - требует, хотя, казалось бы, и незачем. В общем, много еще нужно учиться. ЗЫ Это я на предыдущий пост... Это сообщение отредактировал(а) amg - 12.9.2006, 12:23 |
|||
|
||||
| amg |
|
||||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
|
||||||||||
|
|||||||||||
| sharq |
|
|||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 23 Всего: 28 |
amg, интересно с помощью чего ты время тестировал?
Попробуй Benchmark и повторов этак 10_000, привиди код и результаты. А с помощью Memchmark замереть память - не совсем хорошо, т.к.
А на счет вариантов мое мнение - вариант korob2001 - красивый, быстро работает из-за регулярных выражений, но есть недостатки, н-р - не найдешь индекс, найденного эелемента. Мой вариант - это стандартный в данной ситуации, в стиле Perl, но также есть недостатки. Вариант Nab (последний) - это вариант языка Си, прелести Perl нет. А первый вариант - map для этого не используется. List::Util - хороший модуль, но он загружается в память и для небольшой задачи это не нужно! Обычным перебором - хорошо, но не красиво Итог - вариант стоит использовать тот, кот. в данный ситуации будет наиболее приемлем. Н-р, я использую всегда красивый вариант, если не требуется оптимального решения! Поэтому grep и regexp - это то, что надо. -------------------- [color=gray]There's More Than One Way To Do It[/color] |
|||
|
||||
| Nab |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Все верно ребята вы говорите
Но как я сказал в предыдущем посте, то к примеру я, если мне нужно проверять наличие значения как такового, изначально использовал бы хеш. Ведь все равно производиться заполнение, массива или хеша, а в последствии к хешу доступ по этому параметру намного быстрее. Другое дело объем памяти Ну и конечно о красоте Хотя мои решения с map не такое уж страшное, и как оказалось и в нем есть рациональное зерно PS: amg, а покаж ка, как ты мерял? -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
| Danissimo |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 14.8.2006 Где: Санкт-Петербург Репутация: 1 Всего: 1 |
amg, хочу сказать, не удивляйся, что время поиска по хеш-таблице не зависит от количества элементов. Если посмотреть на цели, с которыми разрабатывались хеш-таблицы, то именно эта цель и преследовалась, а именно: время поиска не должно зависеть от количества элементов, то есть должно быть константным. На языке алгоритмического анализа это записывается так: O(n) = const =)) Я не знаю никакой другой структуры данных, у которой алгоритмическая сложность была бы величиной постоянной. Так что все работает, как и должно =)
|
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Кстати, amg если будет желаение, можешь попробовать компилировать шаблон только один раз, т.е. добавить модификатор "о" к регулярному выражению. Ведь у нас всё равно не меняется значение переменной $number.
-------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| amg |
|
||||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Результаты (больше проценты - быстрее).
|
||||||||||
|
|||||||||||
| amg |
|
||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Добавлено @ 12:21 Спасибо! Буду знать. Добавлено @ 12:28
P.S. Прошу у всех прощения за многословие. |
||||||||
|
|||||||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Многословие в тему, потому прощения просить не нужно. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| evilsoul |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 31.3.2006 Репутация: нет Всего: 0 |
А ты попробуй к списку и массиву обратиться в скалярном контексте, и увидишь разницу |
|||
|
||||
| kavkaz |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 26.12.2007 Репутация: 1 Всего: 2 |
думаю за два года он уже это сам понял
|
|||
|
||||
| evilsoul |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 31.3.2006 Репутация: нет Всего: 0 |
Да а я чо то на даты и не глядел
|
|||
|
||||
| Nab |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
И какова она?
Время не столь важно... -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
||||||
|
|||||||
| krypt3r |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 9.6.2009 Репутация: 2 Всего: 16 |
Археологи)
|
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |