Perl in_array

Программист на PHP спросил есть ли в Perl'e in_array (проверка на существование значения в массиве). Есть конечно! Только делается он так:
if (scalar grep {$_ eq $something} @something)
{
     …
}

Причём, сравнивать можно не только по прямому условию, но и по регулярному выражению, например.

Комментарии 35

Baka № 7
Если нужно (часто) проверять наличие элемента в массиве, надо пользоваться хэшем,
а не массивом. :-)

use strict;
my @something = qw(1 2 3);
my $something = 2;

{ # Вот так
my %hash; @hash{@something} = ();
if (exists $hash{$something}) {
print «$something found\n»;
}
}

{ # Или так
my %hash; @hash{@something} = (1) x scalar @something;
if ($hash{$something}) {
print «$something found\n»;
}
}

{ # Или так
my %hash = map {($_ => 1)} @something;
if ($hash{$something}) {
print «$something found\n»;
}
}

Или с самого начала использовать хэш.
Ray № 13
ну вобщем так.. ;)
сакральное знание — как в комменты не регистрах постить код, мне не открылось.
На попытку удалить «накасяченную» мессагу получаю «u have no rights».
так что пока кроме мусора ничего запостить не смог.
Отошлю тебе по почте, не сочти за наглость. ;)
Евгений Степанищев автор № 14
угу, но сегодня смотреть уже ничего не буду — завтра рано уезжать. А код постить просто — надо использовать < >
Юрий № 15
Прелесть какая: прошло 14 лет, интересно — написал ли Ray свой сакральный вопрос, ответил ли ему bolk ?
Василий № 19
my @array = qw(1 2 3 44);

if (grep(/^44$/, @array)){
say «exists»
}

Конечно же в примере частный случай и там регулярное выражение. Я не подставлял начало и конец строки. Заменил))) Что дальше?
Евгений Степанищев автор № 21
Замечательно, теперь найдите мне элемент, содержащий строку «(?=….)» или просто полученную из внешней переменной.

Кстати, что вообще вас побудило прокомментировать заметку, которой 17 лет?
Василий № 22
Да просто случайно наткнулся)))) Нашёл элемент содержащий строку «(?=….)». Что бы не говорили, но //Perl// очень хороший и мощный язык. Вы согласны?
my @array = qw(1 44 34(?=….)34 44);
my $s = '(?=….)';
my $result =($s)= grep(/\Q$s\E/, @array);

if ($result){
say «exists $s»;
}
Евгений Степанищев автор № 24
Что бы не говорили, но Perl очень хороший и мощный язык. Вы согласны?

Конечно нет. Ваша со мной переписка показывает насколько это не так. А это мы ещё ООП не затронули.

Василий № 23
Кстати, что вообще вас побудило прокомментировать заметку, которой 17 лет?

Я заметил, что заметка очень старая, но решил написать для прикола.

Василий № 25
Конечно нет. Ваша со мной переписка показывает насколько это не так

А что же в переписке такого, что показывает на сколько это не так?
А вы в совершенстве знаете язык Perl и PHP, что позволяет вам делать вывод о том, что Perl плохой язык? Я, например, про PHP ничего не могу сказать т. к. так как опыта большого на нём нет.
По поводу ООП, не буду спорить.

Евгений Степанищев автор № 26
А что же в переписке такого, что показывает на сколько это не так?

То, с какой лёгкостью и сколько раз вы «выстрелили себе в ногу».

А вы в совершенстве знаете язык //Perl// и //PHP//, что позволяет вам делать вывод о том, что //Perl// плохой язык?

Про совершенство не знаю, я программировал на нём пять лет. Про //PHP// я нигде не говорил, что он хороший, вы это где-то у меня прочитали?

По поводу ООП, не буду спорить.

Почему?

Василий № 27
Про совершенство не знаю, я программировал на нём пять лет.

А сейчас на чём программируете?

То, с какой лёгкостью и сколько раз вы «выстрелили себе в ногу».

А можно пример где я выстрелил себе в ногу?

Про совершенство не знаю, я программировал на нём пять лет. Про PHP я нигде не говорил, что он хороший, вы это где-то у меня прочитали?

Да собственно говоря нигде не видел.

— По поводу ООП, не буду спорить.
— Почему?

Да просто нет желания.

Почитал про Вас. С 89 года программируете, впечатляет. Ассемблер — это серьёзно. У меня тоже много предков с Татарстана по маминой линии.

Евгений Степанищев автор № 28
А сейчас на чём программируете?

Так, чтобы за это деньги платили, ни на чём. Я техническим директором работаю сейчас.

А можно пример где я выстрелил себе в ногу?

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

Василий № 29
Ну, собственно, вы решили не ту задачу, которая предлагалась, но не заметили этого два раза. Что это, если не оно?

И это по вашему признак не хорошего и не мощного языка? Если так, то вынужден не согласиться.
То, что я два раза не совсем верно решил задачу не говорит о том, что язык не хороший и не мощный. Это проблема программиста решающего задачу. В данном случае я просто поспешил. Конечно же, если мы ищем по регулярному выражению, то нужно было искать полное совпадение использовав «^$» и при этом учитывать, что там могут быть спецсимволы регулярных выражений которые экранируются «\Q\E».
По поводу ООП ничего сказать не могу т. к. у меня не было случаев когда мне нужно было реализовывать на нём объектный подход. Я читал, что Perl многие ругают, что там как-то криво устроено ООП. Не знаю, может быть они правы. Но в целом язык мне нравится.
По вашей логике язык С++ можно назвать не мощным и не хорошим потому, что там есть указатели которыми нужно уметь пользоваться. И при решении какой-либо задачи можно ошибиться. С ними нужен глаз да глаз. У меня не было большого опыта работы с указателями в С++(старался их избегать), но где-то я читал статейку где рассматривались случаи в которых можно получить серьёзнейшую ошибку из-за их неправильно использования. Ну это же не говорит, что язык плохой. Просто нужно быть профи в этом языке и тогда будет всё классно.

Евгений Степанищев автор № 30
И это по вашему признак не хорошего и не мощного языка?

Признак не хорошего языка — когда разные вещи делаются в нём настолько похоже, что их можно легко перепутать. Не мощный Перл из-за плохого ООП, да что там говорить, в нём даже констант нет.

По вашей логике язык С++ можно назвать не мощным и не хорошим потому

Си++ — мощный, но не хороший язык. Мощный и хороший — это Раст, Ним (в нише Си++).

Василий № 32
«Признак не хорошего языка — когда разные вещи делаются в нём настолько похоже, что их можно легко перепутать.»
Лично меня это не пугает. И Perl мне очень нравится.
Василий № 35
Да, почитал про это. Пишут что это не очень хорошая реализация константы.
Но есть такая реализация: const my $const => 12;
Но нужно модуль установить Const::Fast. Говорят, что такая реализация не даёт проблем…
Понятно, что этот модуль по умолчанию не встроен в perl, но я буду надеяться, что в Perl 7 сделают по уму.