Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

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

Василий 2020

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

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

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

Евгений Степанищев 2020

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

Василий 2020

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

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

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

Евгений Степанищев 2020

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

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

Василий 2020

grep(/^4$/, @array)

Василий 2020

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

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

Евгений Степанищев 2020

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

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

Василий 2020

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

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

Василий 2020

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

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

Евгений Степанищев 2020

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

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

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

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

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

Почему?

Василий 2020

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

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

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

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

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

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

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

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

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

Евгений Степанищев 2020

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

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

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

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

Василий 2020

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

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

Евгений Степанищев 2020

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

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

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

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

Василий 2020

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

Василий 2020

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

Василий 2020

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

Евгений Степанищев 2020

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

Василий 2020

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