Perl in_array
Программист на PHP спросил есть ли в Perl’e in_array (проверка на существование значения в массиве). Есть конечно! Только делается он так:
if (scalar grep {$_ eq $something} @something)
{
…
}
Причём, сравнивать можно не только по прямому условию, но и по регулярному выражению, например.
Вот за это мы и не любим перл.
Комментарий для kukutz:
И то, за что любим его мы :)
в данном случае из-за не соответсвия, открывающих к закрывающим, скобок?
Комментарий для Ray:
Упс.. небрежно писал не заметил :)
Я ненавижу за синтаксис.
А ты, поди, любишь за мощь?
Комментарий для kukutz:
За какую такую мощь? Я его за синтаксис люблю.
Если нужно (часто) проверять наличие элемента в массиве, надо пользоваться хэшем,
а не массивом. :-)
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»;
}
}
Или с самого начала использовать хэш.
Комментарий для Baka:
Кто говорил «часто»? Я говорил о реализации ф-и in_array. А Перл я тоже знаю.
раз уж всё в курсе что такое in_array()
позволю себе наглость задать вопрос:
Комментарий для Ray:
ага? какой?
парсер весь код сожрал даже буковки не оставил, попробую ещё раз.
<code>
</code>
ещё попыточка ;)
парсер весь код сожрал даже буковки не оставил, попробую ещё раз.
<code>
</code>
ну вобщем так.. ;)
сакральное знание — как в комменты не регистрах постить код, мне не открылось.
На попытку удалить «накасяченную» мессагу получаю «u have no rights».
так что пока кроме мусора ничего запостить не смог.
Отошлю тебе по почте, не сочти за наглость. ;)
Комментарий для Ray:
угу, но сегодня смотреть уже ничего не буду — завтра рано уезжать. А код постить просто — надо использовать < >
Прелесть какая: прошло 14 лет, интересно — написал ли Ray свой сакральный вопрос, ответил ли ему bolk ?
Комментарий для Юрий:
:)) Уже и движок «Регистра», про который вопрос, давно помер и используется, на одном-единственном сайте: http://kvnru.ru
my @array = qw(1 2 3 4);
if (grep(/4/, @array)){
say "exists";
}
Даже короче чем на PHP.
Теперь замените «4» у себя в массиве на «44».
my @array = qw(1 2 3 44);
if (grep(/^44$/, @array)){
say "exists"
}
Конечно же в примере частный случай и там регулярное выражение. Я не подставлял начало и конец строки. Заменил))) Что дальше?
Замечательно, теперь найдите мне элемент, содержащий строку «(?=....)» или просто полученную из внешней переменной.
Кстати, что вообще вас побудило прокомментировать заметку, которой 17 лет?
grep(/^4$/, @array)
Да просто случайно наткнулся)))) Нашёл элемент содержащий строку «(?=....)». Что бы не говорили, но Perl очень хороший и мощный язык. Вы согласны?
my @array = qw(1 44 34(?=....)34 44);
my $s = '(?=....)';
my $result =($s)= grep(/\Q$s\E/, @array);
if ($result){
say "exists $s";
}
Конечно нет. Ваша со мной переписка показывает насколько это не так. А это мы ещё ООП не затронули.
Я заметил, что заметка очень старая, но решил написать для прикола.
А что же в переписке такого, что показывает на сколько это не так?
А вы в совершенстве знаете язык Perl и PHP, что позволяет вам делать вывод о том, что Perl плохой язык? Я, например, про PHP ничего не могу сказать т. к. так как опыта большого на нём нет.
По поводу ООП, не буду спорить.
То, с какой лёгкостью и сколько раз вы «выстрелили себе в ногу».
Про совершенство не знаю, я программировал на нём пять лет. Про PHP я нигде не говорил, что он хороший, вы это где-то у меня прочитали?
Почему?
А сейчас на чём программируете?
А можно пример где я выстрелил себе в ногу?
Да собственно говоря нигде не видел.
Да просто нет желания.
Почитал про Вас. С 89 года программируете, впечатляет. Ассемблер — это серьёзно. У меня тоже много предков с Татарстана по маминой линии.
Так, чтобы за это деньги платили, ни на чём. Я техническим директором работаю сейчас.
Ну, собственно, вы решили не ту задачу, которая предлагалась, но не заметили этого два раза. Что это, если не оно?
И это по вашему признак не хорошего и не мощного языка? Если так, то вынужден не согласиться.
То, что я два раза не совсем верно решил задачу не говорит о том, что язык не хороший и не мощный. Это проблема программиста решающего задачу. В данном случае я просто поспешил. Конечно же, если мы ищем по регулярному выражению, то нужно было искать полное совпадение использовав «^$» и при этом учитывать, что там могут быть спецсимволы регулярных выражений которые экранируются «\Q\E».
По поводу ООП ничего сказать не могу т. к. у меня не было случаев когда мне нужно было реализовывать на нём объектный подход. Я читал, что Perl многие ругают, что там как-то криво устроено ООП. Не знаю, может быть они правы. Но в целом язык мне нравится.
По вашей логике язык С++ можно назвать не мощным и не хорошим потому, что там есть указатели которыми нужно уметь пользоваться. И при решении какой-либо задачи можно ошибиться. С ними нужен глаз да глаз. У меня не было большого опыта работы с указателями в С++(старался их избегать), но где-то я читал статейку где рассматривались случаи в которых можно получить серьёзнейшую ошибку из-за их неправильно использования. Ну это же не говорит, что язык плохой. Просто нужно быть профи в этом языке и тогда будет всё классно.
Признак не хорошего языка — когда разные вещи делаются в нём настолько похоже, что их можно легко перепутать. Не мощный Перл из-за плохого ООП, да что там говорить, в нём даже констант нет.
Си++ — мощный, но не хороший язык. Мощный и хороший — это Раст, Ним (в нише Си++).
Ну, если логика такая, то возможно Вы и правы. Я читал, что в Perl 7 будут делать нормальный ООП. Буду надеяться, что так и будет.
«Признак не хорошего языка — когда разные вещи делаются в нём настолько похоже, что их можно легко перепутать.»
Лично меня это не пугает. И Perl мне очень нравится.
По поводу констант. В perl они есть.
use constant СONST => 12;
«In the current implementation, scalar constants are actually inlinable subroutines».
Да, почитал про это. Пишут что это не очень хорошая реализация константы.
Но есть такая реализация: const my $const => 12;
Но нужно модуль установить Const::Fast. Говорят, что такая реализация не даёт проблем...
Понятно, что этот модуль по умолчанию не встроен в perl, но я буду надеяться, что в Perl 7 сделают по уму.