Rose debug info
---------------

Perl in_array

Программист на PHP спросил есть ли в Perl’e in_array (проверка на существование значения в массиве). Есть конечно! Только делается он так:

if (scalar grep {$_ eq $something} @something)
{
     …
}

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

Поделиться
Отправить
28 комментариев
kukutz 2003

Вот за это мы и не любим перл.

Евгений Степанищев (bolknote.ru) 2003

Комментарий для kukutz:

И то, за что любим его мы :)

Ray 2003

в данном случае из-за не соответсвия, открывающих к закрывающим, скобок?

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Ray:

Упс.. небрежно писал не заметил :)

kukutz 2003

Я ненавижу за синтаксис.

А ты, поди, любишь за мощь?

Евгений Степанищев (bolknote.ru) 2003

Комментарий для kukutz:

За какую такую мощь? Я его за синтаксис люблю.

Baka 2003

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

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»;
}
}

Или с самого начала использовать хэш.

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Baka:

Кто говорил «часто»? Я говорил о реализации ф-и in_array. А Перл я тоже знаю.

Ray 2003

раз уж всё в курсе что такое in_array()
позволю себе наглость задать вопрос:

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Ray:

ага? какой?

Ray 2003

парсер весь код сожрал даже буковки не оставил, попробую ещё раз.

<code>

</code>

Ray 2003

ещё попыточка ;)
парсер весь код сожрал даже буковки не оставил, попробую ещё раз.

<code>

</code>

Ray 2003

ну вобщем так.. ;)
сакральное знание — как в комменты не регистрах постить код, мне не открылось.
На попытку удалить «накасяченную» мессагу получаю «u have no rights».
так что пока кроме мусора ничего запостить не смог.
Отошлю тебе по почте, не сочти за наглость. ;)

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Ray:

угу, но сегодня смотреть уже ничего не буду — завтра рано уезжать. А код постить просто — надо использовать < >

Юрий 2017

Прелесть какая: прошло 14 лет, интересно — написал ли Ray свой сакральный вопрос, ответил ли ему bolk ?

Евгений Степанищев (bolknote.ru) 2017

Комментарий для Юрий:

:)) Уже и движок «Регистра», про который вопрос, давно помер и используется, на одном-единственном сайте: http://kvnru.ru

Василий 5 мес

my @array = qw(1 2 3 4);

if (grep(/4/, @array)){
    say "exists";
}

Даже короче чем на PHP.

Евгений Степанищев 5 мес

Теперь замените «4» у себя в массиве на «44».

Василий 5 мес

my @array = qw(1 2 3 44);

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

Конечно же в примере частный случай и там регулярное выражение. Я не подставлял начало и конец строки. Заменил))) Что дальше?

Евгений Степанищев 5 мес

Замечательно, теперь найдите мне элемент, содержащий строку «(?=....)» или просто полученную из внешней переменной.

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

Василий 5 мес

grep(/^4$/, @array)

Василий 5 мес

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

if ($result){
    say "exists $s";
}

Евгений Степанищев 5 мес

Что бы не говорили, но Perl очень хороший и мощный язык. Вы согласны?

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

Василий 5 мес

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

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

Василий 5 мес

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

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

Евгений Степанищев 5 мес

А что же в переписке такого, что показывает на сколько это не так?

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

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

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

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

Почему?

Василий 5 мес

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

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

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

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

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

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

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

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

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

Евгений Степанищев 5 мес

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

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

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

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

Василий 5 мес

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

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

Евгений Степанищев 5 мес

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

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

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

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

Василий 5 мес

Ну, если логика такая, то возможно Вы и правы. Я читал, что в Perl 7 будут делать нормальный ООП. Буду надеяться, что так и будет.

Василий 5 мес

«Признак не хорошего языка — когда разные вещи делаются в нём настолько похоже, что их можно легко перепутать.»
Лично меня это не пугает. И Perl мне очень нравится.

Василий 5 мес

По поводу констант. В perl они есть.
use constant СONST => 12;

Евгений Степанищев 5 мес

«In the current implementation, scalar constants are actually inlinable subroutines».

Василий 5 мес

Да, почитал про это. Пишут что это не очень хорошая реализация константы.
Но есть такая реализация: const my $const => 12;
Но нужно модуль установить Const::Fast. Говорят, что такая реализация не даёт проблем...
Понятно, что этот модуль по умолчанию не встроен в perl, но я буду надеяться, что в Perl 7 сделают по уму.