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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Есть ли $var в @arr, скаляр в массиве 
:(
    Опции темы
MakTpaxep
Дата 8.8.2011, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А нет ли способа быстро и красиво проверить есть ли скаляр в обычном массиве, при этом не юзая хэш?
PM MAIL   Вверх
arto
Дата 8.8.2011, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

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



perldoc List::Util на предмет first
PM MAIL ICQ   Вверх
MakTpaxep
Дата 8.8.2011, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо, сейчас пошарю
PM MAIL   Вверх
vadiml
Дата 8.8.2011, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



if ( $var ~~ @array ) {
# есть
}
PM MAIL Jabber   Вверх
afiskon
Дата 8.8.2011, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

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



Код

if ( $var ~~ @array ) {
# есть
}

Это Perl 6 или в 5.14 уже можно? Или я окончательно отстал от жизни? )
PM MAIL WWW   Вверх
vadiml
Дата 8.8.2011, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Это 5.10 и выше, в т.ч. и Perl6
PM MAIL Jabber   Вверх
Pfailed
Дата 8.8.2011, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



afiskon, начиная с 5.10 так можно. 
http://perldoc.perl.org/perlsyn.html#Smart...ching-in-detail


--------------------
PM MAIL   Вверх
DurRandir
Дата 8.8.2011, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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"]]'

Запустите, удивитесь, и подумайте, точно ли вам нужен смарт матчинг в текущем его виде.
PM   Вверх
vadiml
Дата 8.8.2011, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



DurRandir
С любой функцией должно быть понимание как оно работает, какие есть ньюансы, 
при желании можно привести примеры, например на поиск чисел и строк -- здесь контекст тоже влияет.

Но когда понимаешь, то никакого удивления нет, и пользоваться оператором весьма удобно.

По вопросу данной темы оператор полностью подходит.
PM MAIL Jabber   Вверх
DurRandir
Дата 8.8.2011, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Проблема смарт матчинга в том, что невозможно достигнуть понимания, как он будет работать с данными. Как только вы его применяете к чему-то, отличному от случая scalar ~~ scalar, грабли разложены и взведены. Я не просто так случайные примеры привёл. А именно для этого случая - особенно обратите внимание на пару сравнений 2-4. Очень логичное поведение, не правда ли?) Да, всё это (и много других разных случаев) описаны в перлдоке - но выбор как именно будет происходить сравнение настолько сложен, что легко ошибиться в применении этого самого перлдока.
PM   Вверх
vadiml
Дата 8.8.2011, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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 и предыдущих знаний перла чтобы понять все принципы.
PM MAIL Jabber   Вверх
DurRandir
Дата 10.8.2011, 03:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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 - можно.
PM   Вверх
Malme
Дата 10.8.2011, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

perldoc List::Util на предмет first 


так first вроде в обычный foreach разворачивает в конце концов
PM MAIL WWW   Вверх
arto
Дата 10.8.2011, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

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



нет.
perldoc -m List::Util
PM MAIL ICQ   Вверх
vadiml
Дата 10.8.2011, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



DurRandir
> Найдите логику.

Логика во всех выражениях очень проста: если ~~ может второй элемент получить как ссылку на массив (или привести к этой ссылке), то он сработает.
Я потому и привёл пример с qw() что там это явно видно -- в обычном qw() список есть, а переменной нет.
А чтобы знать когда может, а когда нет, достаточно знать С-структуры в которых в перле хранятся переменные.
Пересказывать perlxs, perlxstut, perlguts и т.п. думаю здесь смысла нет.

> Не аналогичное.
Вы недочитали что я написал: "если в них нет явного приведения типов", и тут же показываете  == и eq, которые  выполняют именно *явное* приведение у указанному типу, == к числу, eq к строке.

"1 bar" ~~ 1 или "1"  по смыслу ничем не отличаются от моего примера,
и ~~ при желании можно заставить работать с переменными только как со строками, или только как с числами

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


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

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


 




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


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

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