LINUX.ORG.RU

Perl мертв. Да здравствует Perl!


0

0

JT Смит, президент Plain Black, создатель WebGUI, и однин из незамеченных, но успешно использующих Perl в бизнесе, недавно послал мне это эссе. Он дал мне(O'Reilly) разрешение издать это полностью здесь.

Каждый день, я задумываюсь о том, почему я пишу на Perl а не на PHP, Java, C#, Ruby, Python, или [подставте ваш любимый язык сюда]? Люди говорят что, "Perl не используется больше" или, "Рубин - рулез..."

Есть миллионы программистов Perl во всем мире. Perl 5 активно поддерживается, и Perl 6 находится в развитии. Больше чем 3000 Модулей Perl были выпущены в 2006г, и вдвое больше должны быть выпущены в этом году. Действительность состоит в том, что Perl является совсем не мертвым.

>>> Взято с сайта =>



Проверено: Shaman007 ()

Ответ на: комментарий от anonizmus

>> ... перепишешь по новой, ага.

> Если ты лезешь в код - предполагается что ты как то ознакомлен с языком на котором этот код написан,

Сравни возможноти выпендриться в яве, питоне и перле.

sv75 ★★★★★
()
Ответ на: комментарий от mihalych

>> $$array[2][0]

> Если честно, я так никогда не пишу. И не посоветовал бы так писать.

все дело привычки, -> обычно пишешь если много С/С++ надо писать. А когда покопаешься много с перловым кодом, то разницы ни какой

vadiml ★★★★★
()
Ответ на: комментарий от mihalych

> А если учесть, что условие может состоять из любого числа выражений (для чего в Python требуется создать отдельную именную функцию)

Вот и показал бы разумный пример когда питоновские обрезанные (согласен) лямбды уже никак, но куча кода в грепе еще читабельна. После чего перейдем на сравнения с руби вместо питона... чушу.

> А те же, кто открыты к знаниям, найдут в Perl 6 свой рай, впрочем такие и в Perl 5 его находят. :)

Мда, глядя на перловый код, я уже кажется начинаю любить (о ужас) жаву....

sv75 ★★★★★
()
Ответ на: комментарий от sv75

>Сравни возможноти выпендриться в яве, питоне и перле.

опять 25. Ну да, для этого и существует дохрена ЯП, что бы "от каждого по возможностям, каждому - по потребностям".

А еще существует огромное кол-во различных музыкальных жанров, например, давайте поговорим о том что большинству проще и слаще на слух голос какой нить поп пи[...]ы, нежели что-нибудь действительно достойное, а еще большинство представителей нашего социума пьют водку, смотрят дом2 и голосуют за путина. Потому что да, это проще, и ?

anonizmus
()
Ответ на: комментарий от sv75

> Чем мне не нравится ссылки в скриптовых языках? Самим фактом своего существования, я думаю.

раз в 5-й версии перла их добавили, значит все же были нужны (вообще без них многие вещи очень геморно делать, как бы интерпретатор/язык и не пытался всё в себе спрятать, всё равно вылезут ограничения)

vadiml ★★★★★
()
Ответ на: комментарий от anonizmus

> опять 25.

Ты теорию разводишь, а у нас в перле уже три способа достать элемент из вложенного списка.

sv75 ★★★★★
()
Ответ на: комментарий от anonizmus

>Перл:

>use GD;
>$png = newFromPng GD::Image('labirint.png',1);

>for$x(@r=0..640){$m{"$x $_"}=$png->getPixel($x,$_)for@r};

>@c=(639,0);
>while(640-$c[1]){push@p,[@c];$m{"@c"}|=1;
>c(-1)||c(0,1)||c(1)||c(0,-1)or@c=@{pop@p,pop@p};}

>print chr($m{"@$_"}>>16)while$_=splice@p,0,2;

>sub c{@b=map$c[$_]+$_[$_],0,1;!($m{"@b"}%2)and@c = @b;}


Это конкурс на самый запутанный код? Хотя что-то в этом есть... Представляю, каково ощущать себя матерым перловиком - от крутости майка на груди рвется и земля под ногами проваливается. Как там у них говорится... MacGyver would use Perl - и этим все сказано.


anonymous
()
Ответ на: комментарий от mihalych

> Отфильтровать любой список с помощью grep, что же может быть понятнее. А если учесть, что условие может состоять из любого числа выражений (для чего в Python требуется создать отдельную именную функцию), то и сравнивать-то тут не с чем.

А если с другой стороны на это посмотреть, то в Питоне можно задействовать для фильтрации уже имеющуюся функцию. А в Перле как быть? Так что и сравнивать тут не с чем ;) (А на самом деле, разницы особой нет)

Hjorn
()
Ответ на: комментарий от mihalych

> Редко когда надо залезть в структуру глубоко, заранее зная точный путь к внутреннему элементу.

У меня такие задачи почему-то возникают сплошь и рядом.

Это наверное потому что Python ПОЗВОЛЯЕТ делать нормальные структуры, без геморроя.

yk4ever
()
Ответ на: комментарий от anonymous

>Это конкурс на самый запутанный код? Хотя что-то в этом есть...

На самый короткий.

anonizmus
()
Ответ на: комментарий от sv75

> Сколько человек *сами* долдумались до grep {!$_{$_}++} ? Если такие есть, я потрясен вашими умом, честно.

Ну, я додумался. Согласен, не все могут знать о существовании переменной %_, которую можно для своих целей использовать. Но для понимания того, что делает данный код, достаточно тривиальных знаний о Perl и ничего большего. А так тебе тот же пример более читабельней будет?

my %element_counts = ();

my @filtered_list = grep { $element_counts{$_}++ == 0 } @list;

Если всё равно не понятно, то думай так: когда первый раз встретился элемент в списке, он учитывается, во второй же раз уже нет (а если убрать " == 0" или "!", тогда наоборот, лишь повторения учитываются).

> Расскажешь о том как делать вложенные списки без ссылок?

Ты просто не понимаешь, о чём говоришь. То что ты называешь ссылкой, это тот же самый механизм по которому Python или Ruby хранят любые структуры данных. Просто в Perl есть дополнительные возможности, а именно кроме ссылок работать с листовыми переменными @array и %hash (хотя хранятся они аналогично ссылкам, но есть концептуальная разница в синтаксисе). Как раз ссылками/объектами (назови как хочешь) Perl не отличается от твоего любимого языка.

mihalych ★★★
()
Ответ на: комментарий от mihalych

> Как раз ссылками/объектами (назови как хочешь) Perl не отличается от твоего любимого языка.

Только в других языках работа с ссылками прозрачна, а в Перл требуется уродливый дереференсинг. Тут либо все другие создатели языков - дураки, либо...

Hjorn
()
Ответ на: комментарий от yk4ever

> > Редко когда надо залезть в структуру глубоко, заранее зная точный путь к внутреннему элементу.

> У меня такие задачи почему-то возникают сплошь и рядом.

Так и у меня возникают, я же аж 5 способов дал, как извлечь элемент из вложенного списка. Зачем же ты прицепился к шестому (разбить извлечение на этапы)? Может тебе для общего развития также дать все способы определения/создания вложенные структур в Perl или на слово поверишь (как опция, почитаешь в документации), что их много?

> Это наверное потому что Python ПОЗВОЛЯЕТ делать нормальные структуры, без геморроя.

Ты полный дурак, извини, если такой вывод сделал. По вложенным структурам Питон никакого преимущества над Перлом не имеет, разве что в нём меньше возможностей работать с ними. Как раз для Питона вложенные структуры не естественны по природе, их описывают скобочным синтаксисом Перла, а не родной индентацией.

mihalych ★★★
()
Ответ на: комментарий от vadiml

>> Чем мне не нравится ссылки в скриптовых языках? Самим фактом своего существования, я думаю.

> раз в 5-й версии перла их добавили, значит все же были нужны

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

sv75 ★★★★★
()
Ответ на: комментарий от sv75

>Конечно, были, спору нет. О чем и речь - а не костыль ли это и следствие ошибок при создании языка?

вспомнилось старое - "unix - это стройная система костылей и подпорок" (c)

anonizmus
()
Ответ на: комментарий от sv75

> Конечно, были, спору нет. О чем и речь - а не костыль ли это и следствие ошибок при создании языка?

был бы костыль -- он был бы не удобен и ни кто ссылками бы не пользовался. А здесь под них был переработан язык

ЗЫ ссылки в перл -- это не прямые указатели на память, как в С, т.е. из перла реальная память не доступна.

хотя в модуле на С есть функция преобразования, в которой указывается в указатель какого типа данных С преобразовывается эта ссылка.

vadiml ★★★★★
()
Ответ на: комментарий от mihalych

> Ну, я додумался.

Снимаю шляпу.

> Но для понимания того, что делает данный код, достаточно тривиальных знаний о Perl и ничего большего.

Чтобы понять - да, согласен. БОльшие сложности, как мне кажется, с тем чтобы понять, как этот код *написать*. Особенно "чисто перловский", а не как в этом примере.

> А так тебе тот же пример более читабельней будет?

Да, разумеется. Этот вариант от моего питоновского слабо отличается.

> То что ты называешь ссылкой, это тот же самый механизм по которому Python или Ruby хранят любые структуры данных.

Я в курсе. Однако В Питоне это *скрытый* механизм. А тут - назойливый.

> Как раз ссылками/объектами (назови как хочешь) Perl не отличается от твоего любимого языка.

У меня нет любимого языка, но понятностть питона мне в текйщий момент сильно ближе. Кроме того я думаю, разрешать ли писать лабы на перле. В ходе флейма склонился, что да. (Интересно, у него биндинги к гтк сейчас работают? А под виндой?)

sv75 ★★★★★
()
Ответ на: комментарий от vadiml

> ЗЫ ссылки в перл -- это не прямые указатели на память, как в С, т.е. из перла реальная память не доступна.

Да, в Перле это это просто "syntax salt" :)

sv75 ★★★★★
()
Ответ на: комментарий от anonizmus

> вспомнилось старое - "unix - это стройная система костылей и подпорок" (c)

Кстати если почитать Unix Haters handbook (наверное эта фраза из ой же эпохи), то появляется уверенность, что именно сейчас мы наблюдаем золотой век никсов :)

sv75 ★★★★★
()
Ответ на: комментарий от sv75

> Да, в Перле это это просто "syntax salt" :)

Ой, Syntactic salt.

sv75 ★★★★★
()
Ответ на: комментарий от yk4ever

> > дезориентирующего кода Питона и подобных языков, где всё выглядит как монотонная каша и identificator может быть как переменной, так и функцией, так и именем класса, так и конструктором класса

> И всё это будет переменной, и более того - объектом. Который отвечает на различные сигналы.

А-га, и зарезервированные слова языка (что ты стёр из моей цитаты) тоже является объектом, отвечающим на сигналы, и ты можешь быть спокоен, что завтра новое резервное слово не будет конфликтовать с твоей переменной или именем класса.

А уж по читабельности и мечтать больше не о чем. Смотришь на identificator и в нирване на пол часа, не то что с этим пошлым долларом, когда сразу понятно, что тут за зверь.

> По-моему на все хитрозадые криптографические примеры перла питонщики уже дали адекватное читабельное алаверды.

Это где же? Те однострочные ламбды где for смешан с if? И по твоему это читабельно и моментально понятно, что в коде творится? Расширяемо? По моему, нет.

Да и не в криптографических примерах счастье, а в идиомах и в чувстве, что всё тебе подвласно и язык ничем тебя не ограничивает. Я вот криптографически не пишу, но всевозможные вкусности языка и его идиомы (Google даёт много результатов на "perl idioms", чтобы мне тут повторяться) всё же использую.

mihalych ★★★
()
Ответ на: комментарий от anonizmus

>> (Интересно, у него биндинги к гтк сейчас работают? А под виндой?)

> Работают. Под венду - хз, скорее всего тоже.

Год назад под винду не работали. Ну да фиг с нею, с виндой...

sv75 ★★★★★
()
Ответ на: комментарий от Hjorn

Ну я же не спорю, что можно (и уже в Perl 6 сделано) оптимизировать синтаксис, при этом не потеряв существующей функциональности и сущности. Но нападки на Perl 5 довольно необоснованы. Никаких серьёзных проблем существующий синтаксис не создаёт, всё довольно прозрачно. А то, что новичкам может быть сложно сразу использовать всё богатство синтаксиса, так если ровнятся на новичков, то и язык выйдет исключительно для новичков. А что делать новичку через пару лет, так и остановиться в развитии, дабы не дай бог не узнать больше следующего новичка?

mihalych ★★★
()
Ответ на: комментарий от sv75

>А, фраза приписывается Луговскому? Тогда она не старая.

Если ты про юникс и подпорки - она была за сто лет до луговских. В общем думаю корни у нее в мит где-нить даже.

anonizmus
()
Ответ на: комментарий от sv75

> Я в курсе. Однако В Питоне это *скрытый* механизм. А тут - назойливый.

показывать ссылки или нет -- это как подход к пользователям со стороны винды и линукса -- показывать что внутри или нет, ведь внутри всё равно используются

vadiml ★★★★★
()
Ответ на: комментарий от vadiml

Как и все аналогии, эта - кривая. Для этих целей есть "ассемблер с человеческим лицом" - C.

В конце концов, ссылки тут по сути всюду. А показаны не все а только так называемые references. Которые при этом не являются физическими указателями. Тут мне лично становится ясно, что references сильно похожи на костыль.

sv75 ★★★★★
()
Ответ на: комментарий от mihalych

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

напиши программу, с которой сможет работать любой дурак, и только дурак с ней и захочет работать (с) не помню чьё

vadiml ★★★★★
()
Ответ на: комментарий от mihalych

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

Никак нет! Просто сделайте язык, в котором даже новичок сможет быстро использовать все богатство синтаксиса.

sv75 ★★★★★
()
Ответ на: комментарий от vadiml

> напиши программу, с которой сможет работать любой дурак, и только дурак с ней и захочет работать (с) не помню чьё

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

sv75 ★★★★★
()
Ответ на: комментарий от vadiml

> показывать ссылки или нет -- это как подход к пользователям со стороны винды и линукса -- показывать что внутри или нет, ведь внутри всё равно используются

А разве перловые ссылки показывают что внутри? :/ Это ведь совсем не указатели, как вы правильно сказали. А их сходство с указателями только сбивает с толку.

Hjorn
()
Ответ на: комментарий от sv75

> Тут мне лично становится ясно, что references сильно похожи на костыль.

а Вы можете придумать способ быстрой передачи в функцию большого массива (или любого другого большого блока данных) или вернуть из функции созданный в ней массив? если нет ссылок, то массив приходится делать глобальной переменной + сама функция должна знать про эту переменную.

А если язык сам всегда передает ссылки внутри, придется внутри заново всё переприсваивать новым переменным для локальности данных, нарушается отделение данных программы и функции.

а когда ссылки есть, то глупо не использовать их везде, где они ускоряют скорость работы программы

vadiml ★★★★★
()
Ответ на: комментарий от anonizmus

> Лабиринт который надо решить и потом вывести каждое второе значение красной компоненты цвета пиксела.
> Запостите плиз код на питоне, интересно. (пример не мой)

import Image
im = Image.open('labirint.png')
trace = []
loc = (639, 0)

def chk(l):
    global loc
    try:
        if im.getpixel(l)[2] < 255:
            loc = l
            return True
    except IndexError: pass

def do_step():
    x, y = loc
    for s in [(x-1,y),(x,y+1),(x+1,y),(x,y-1)]:
        if chk(s): return True
    
while loc[1]!=640:
    trace.append(loc)
    im.putpixel(loc, im.getpixel(loc)[:2]+(255,255))
    if not do_step():
        trace.pop(); loc = trace.pop()

print ''.join(chr(im.getpixel(loc)[0]) for loc in trace[1::2])

yk4ever
()
Ответ на: комментарий от sv75

> Я полагаю, что каждый дурак сможет работать с веб-броузером - и ничего, массового перехода снобов на lynx не случилось.

не сможет, как минимум кто-то должен объяснить web, что такое адрес, зачем его вводить, .........

vadiml ★★★★★
()
Ответ на: комментарий от mihalych

> ты можешь быть спокоен, что завтра новое резервное слово не будет конфликтовать с твоей переменной или именем класса.

Угу, я спокоен, потому что питон делают правильные люди, которые не ломают обратной совместимости.

> Смотришь на identificator и в нирване на пол часа

А ты не смотри, ты работай с ним. Тип переменной всегда ясен из контекста.

> Те однострочные ламбды где for смешан с if? И по твоему это читабельно и моментально понятно, что в коде творится?

Это называется List Comprehensions. И, да, они моментально понятны.

> а в идиомах и в чувстве, что всё тебе подвласно и язык ничем тебя не ограничивает

Угу. До такой степени ничем не ограничивает, что нельзя по именам аргументы в функцию передавать. А создание вложенных списков первращается в приключение, требующее знания двух томов мануалов.

yk4ever
()
Ответ на: комментарий от mihalych

> Ну я же не спорю, что можно (и уже в Perl 6 сделано) оптимизировать синтаксис, при этом не потеряв существующей функциональности и сущности.

Так об этом и речь. Можно было оптимизировать ещё при разработке Perl5. Но тогда не решились ломать обратную совместимость, хотя в итоге всё равно большую часть стороннеого кода пришлось переписывать под Perl5. А самое интересное, что позже этот костыль обозвали фичей. Впрочем, в кэмелбук Ларри пишет обо всех странностях Перла как о фичах. Зачем же тогда перемололи синтаксис в Perl6, если и нынешний всех устраивает?

Hjorn
()
Ответ на: комментарий от vadiml

> не сможет, как минимум кто-то должен объяснить web, что такое адрес, зачем его вводить

ха! Они даже адрес вводят в поле поиска яндекса (который у них стартовой страницей). А обычно они просто ищут без всяких адресов. Или тыкают на присланные по почте-аське (на все, конечно).

sv75 ★★★★★
()
Ответ на: комментарий от yk4ever

> До такой степени ничем не ограничивает, что нельзя по именам аргументы в функцию передавать

пожалуйста, по-подробнее об этом, где чего нельзя?

> А создание вложенных списков первращается в приключение, требующее знания двух томов мануалов.

ага, весьма сложно написать и понять:

$array[0][0] = 1; $array[0][1] = 2; $array[1][0] = 3; ...

я не представляю каким тогда сложным языком для Вас является С, в нем ведь массив ещё и объявить надо (про malloc даже вспоминать страшно)

vadiml ★★★★★
()
Ответ на: комментарий от vadiml

> а Вы можете придумать способ быстрой передачи в функцию большого массива (или любого другого большого блока данных) или вернуть из функции созданный в ней массив? если нет ссылок, то массив приходится делать глобальной переменной

Мальчег, мы уже поняли что ты кроме перла и чего-то ещё низкоуровневого - никаких языков не видел. Я вот например встречал фортранщика, которому на склоне лет показали PHP - теперь он брызжа слюной заявляет, что PHP - это саморульный язык всех времён и народов.

Так ты теперь объясни, зачем в перле нужны эти стрёмные "->" и два синтаксиса для описания списков, если все остальные скриптовые языки прекрасно обходятся без них, обеспечивая как минимум ту же функциональность?

yk4ever
()
Ответ на: комментарий от sv75

> А обычно они просто ищут без всяких адресов. Или тыкают на присланные по почте-аське (на все, конечно).

вот в том-то вся и проблема

vadiml ★★★★★
()
Ответ на: комментарий от vadiml

> ага, весьма сложно написать и понять: > $array[0][0] = 1; $array[0][1] = 2; $array[1][0] = 3; ...

Нееет. Мне весьма сложно понять, зачем писать "(1,2,[3,4])" а не "[1,2,[3,4]]". Или зачем, воспользовавшись вторым случаем, писать $a->[0][1].

yk4ever
()
Ответ на: комментарий от vadiml

> я не представляю каким тогда сложным языком для Вас является С, в нем ведь массив ещё и объявить надо (про malloc даже вспоминать страшно)

Не, с Це некорректно сравнивать. Это совсем другого поля ягода. Хотя если брать только синтаксис, то и тут Перл имеет бледный вид.

Hjorn
()
Ответ на: комментарий от sv75

> В Питоне это *скрытый* механизм. А тут - назойливый.

Дело вкуса. Да и Zen of Python говорит, что "Explicit is better than implicit", так что скрывать механизм референсинга/дереферинсинга было бы неверно. ;-)

> биндинги к гтк сейчас работают?

У меня есть лишь одно графическое приложение, которое я регулярно запускаю (кроме firefox) и оно на gtk-perl. Платформы:

http://gtk2-perl.sourceforge.net/platforms/

mihalych ★★★
()
Ответ на: комментарий от yk4ever

> Я вот например встречал фортранщика,

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

> зачем в перле нужны эти стрёмные "->"

стандартный способ работы со ссылкой

> два синтаксиса для описания списков

второй способ нужен для подстановки в строки, например если есть ссылка с функцией, то можно к ней обратится как &{$link}, к ссылке на переменную -- как ${$link}, но для краткости {} можно опустить, если из контеста ясно что это такое, соответственно получится $$link

vadiml ★★★★★
()
Ответ на: комментарий от vadiml

>> зачем в перле нужны эти стрёмные "->" > стандартный способ работы со ссылкой

Я не спросил "что это". Я спросил - зачем? На кой в высокоуровневом языке "ссылки"?

Вон даже компилируемый D при работе с динамическими списками без явных ссылок обходится. А из перла торчит такой костылище.

yk4ever
()
Ответ на: комментарий от yk4ever

> Мне весьма сложно понять, зачем писать "(1,2,[3,4])" а не "[1,2,[3,4]]"

в () -- просто перечень через запятую, а [] -- это уже анонимный массив. Если так интересно, может проще в perldoc глянуть? Если у Вас не винда, то perl на машине точно есть.

а если все же винда -- то Вас надо отправлять в игнор как тролля

vadiml ★★★★★
()
Ответ на: комментарий от Hjorn

> Зачем же тогда перемололи синтаксис в Perl6, если и нынешний всех устраивает?

Да просто абсолютно непринципиально, использовать ли, скажем, "->" или ".". Если не-перлистам удобнее ".", то почему бы им не угодить. Столько глупых нареканий в сторону языка можно съекономить. :)

Впрочем, там всё же введёно также немало невиданного-в-других-языках синтаксиса, раз уж оптимизировать, то вводя новые удобные идиомы. :)

mihalych ★★★
()
Ответ на: комментарий от vadiml

> а Вы можете придумать способ быстрой передачи в функцию большого массива (или любого другого большого блока данных) или вернуть из функции созданный в ней массив?

Не очень понял. По вашему если в языке нет в явном виде 
ссылок - копируют сами данные? Нет:

def f(some):
    some.reverse()
  
a = [1, 2, 3]  
f(a)
print a; # [3, 2, 1]
    

sv75 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.