![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
MakTpaxep |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 25.11.2010 Репутация: нет Всего: нет |
А нет ли способа быстро и красиво проверить есть ли скаляр в обычном массиве, при этом не юзая хэш?
|
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
perldoc List::Util на предмет first
|
|||
|
||||
MakTpaxep |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 25.11.2010 Репутация: нет Всего: нет |
Спасибо, сейчас пошарю
|
|||
|
||||
vadiml |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: 5 Всего: 7 |
if ( $var ~~ @array ) {
# есть } |
|||
|
||||
afiskon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 31.3.2011 Где: Россия, Москва Репутация: нет Всего: 4 |
Это Perl 6 или в 5.14 уже можно? Или я окончательно отстал от жизни? ) |
|||
|
||||
vadiml |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: 5 Всего: 7 |
Это 5.10 и выше, в т.ч. и Perl6
|
|||
|
||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
||||
|
||||
DurRandir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 14 Всего: 17 |
perl -e 'print 1 if "abc" ~~ sub {1}'
perl -e 'print 1 if "abc" ~~ [sub {1}]' perl -e 'print 1 if "abc" ~~ /.*/' perl -e 'print 1 if "abc" ~~ [/.*/]' perl -e 'print 1 if "abc"~~[["abc"]]' Запустите, удивитесь, и подумайте, точно ли вам нужен смарт матчинг в текущем его виде. |
|||
|
||||
vadiml |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: 5 Всего: 7 |
DurRandir,
С любой функцией должно быть понимание как оно работает, какие есть ньюансы, при желании можно привести примеры, например на поиск чисел и строк -- здесь контекст тоже влияет. Но когда понимаешь, то никакого удивления нет, и пользоваться оператором весьма удобно. По вопросу данной темы оператор полностью подходит. |
|||
|
||||
DurRandir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 14 Всего: 17 |
Проблема смарт матчинга в том, что невозможно достигнуть понимания, как он будет работать с данными. Как только вы его применяете к чему-то, отличному от случая scalar ~~ scalar, грабли разложены и взведены. Я не просто так случайные примеры привёл. А именно для этого случая - особенно обратите внимание на пару сравнений 2-4. Очень логичное поведение, не правда ли?) Да, всё это (и много других разных случаев) описаны в перлдоке - но выбор как именно будет происходить сравнение настолько сложен, что легко ошибиться в применении этого самого перлдока.
|
|||
|
||||
vadiml |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: 5 Всего: 7 |
Я не понимаю что может смущать в пример 2-4, там всё логично.
По аналогичной причине не работает perl -e 'print "A" ~~ qw(A B C)' хотя всё впорядке с perl -e 'print "A" ~~ [qw(A B C)]' И я вижу только 1 граблю которую сложно учесть -- это порядок приведения типов. Сравните ответы: perl -e '$x = 0; $y = ""; print $y ~~ $x' perl -e '$x = 0; $y = ""; print $x ~~ $y' Но аналогичное вылезет и при использовании разных Utils::* если в них нет явного приведения типов до момента поиска. PS perldoc-a по ~~ я не читал, мне хватило нескольких эксперименов с perl -e и предыдущих знаний перла чтобы понять все принципы. |
|||
|
||||
DurRandir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 14 Всего: 17 |
>там всё логично
$a ~~ CODE - match $a ~~ [CODE] - match $a ~~ REGEX - match $a ~~ [REGEX] - NO match Найдите логику. >По аналогичной причине не работает По какой причине? Там везде рабочие примеры, они делают то, что заложено создателями ~~, но это НЕ очевидно. Ну и массив там везде создаётся принудительно, нет никакой проблемы с интерпретацией правой части выражения. >понять все принципы Не заглядывая в перлдок) Может ли не сматчиться следующая конструкция $a ~~ sub {1} ? >аналогичное вылезет и при использовании разных Utils::* Не аналогичное. Там вы либо везде а) задаёте свой компаратор б) есть строковая/числовая версия (т.е. явно заданное в контракте использование eq/==). С ~~ же происходят более забавные вещи - ладно пустые строки и ноль, вот ещё пара: "1 bar" ~~ 1 "1 bar" ~~ "1" И, не меняя данных, это нельзя разрешить используя ~~. Используя list utils - можно. |
|||
|
||||
Malme |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 10.8.2011 Где: Москва Репутация: нет Всего: нет |
так first вроде в обычный foreach разворачивает в конце концов |
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
нет.
perldoc -m List::Util |
|||
|
||||
vadiml |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: 5 Всего: 7 |
DurRandir,
> Найдите логику. Логика во всех выражениях очень проста: если ~~ может второй элемент получить как ссылку на массив (или привести к этой ссылке), то он сработает. Я потому и привёл пример с qw() что там это явно видно -- в обычном qw() список есть, а переменной нет. А чтобы знать когда может, а когда нет, достаточно знать С-структуры в которых в перле хранятся переменные. Пересказывать perlxs, perlxstut, perlguts и т.п. думаю здесь смысла нет. > Не аналогичное. Вы недочитали что я написал: "если в них нет явного приведения типов", и тут же показываете == и eq, которые выполняют именно *явное* приведение у указанному типу, == к числу, eq к строке. "1 bar" ~~ 1 или "1" по смыслу ничем не отличаются от моего примера, и ~~ при желании можно заставить работать с переменными только как со строками, или только как с числами > Используя list utils - можно. Когда важна оптимизация по скорости и, особенно, по потреблению памяти, уже не желательно: подтянешь десяток другой модулей, и на web-сервере каждый поток уже выжирает несколько сот МВ памяти, а потоков то 20-50 штук. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |