LINUX.ORG.RU

Сегодня языку Perl исполнилось 25 лет!

 , , ларри уолл


5

2

25 лет назад, 18 декабря 1987г., программист и лингвист Ларри Уолл выпустил первую версию языка программирования Perl.

>>> Подробности



Проверено: JB ()
Последнее исправление: JB (всего исправлений: 4)
Ответ на: комментарий от anonymous

Оператор qr// не ?

Хм, да.

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

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

...Куча говна на CPAN - это те модули которые....

Могу подтвердить как честный фраер-перловик: это правда, CPAN содержит уйму отстоя. НО(!) если убрать слово Перл и заменить на FOSS, то мы с удивлением обнаруживаем полную тождественность! Т.е. CPAN просто как срез опенсорса прекрасно показывает качество «бесплатного» софта. Однако, в Перле, как и в FOSS, тебе никто и ничего не должен! Люди просто собрали воедино всё то, что им было полезно и надо не быть скотиной, чтобы сказать хотя бы спасибо за то, что не подымая ж*** ты можешь набрать cpan.org и получить почти готовое решение почти любой проблемы. Кроме того, эти решения можно допилить (если кишка не тонка проектировать профессионально) и тогда CPAN станет ещё на одну библиотеку мощнее!
Критиковать с моноклем в глазе может любое **о, а вот понять мощь Перла+CPAN - одного красноглазия мало, тут интеллект нужен.

matumba
()

Солидный срок. Покойся с миром, не вставай.

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

Мусью, а с чем вы сравниваете похапэ?

Perl+CPAN. От простейшего «асп»-кодинга из модуля ASP::Perl до всяких клиентов БД, SSL, парсинг форм, обработка изображений, и прочая фигня. При этом (помимо объективно более мощной библиотеки), Перл как язык имеет на порядок более грамотную структуру. Воистину, только двоечник, прогуливавший лекции по Перл, мог сваять похапэ уродца.

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

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

ммм, не, не на том выступлении что видел.

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

Bugzilla, OTRS, ЖЖ и даже PHP :-) Раньше многие проекты были на Perl - rambler почта, например, множество крупных западных сервисов. Посмотрите блог о архитектурах highload Ивана Блинкова.

nempyxa
()

!!!

Питон придуманная наркоманами из мелкософта хрень! Ни синтаксиса ни логики ни нормальных человеческих функций. Например легендарные С и С++ (на которых написаны оси и другие великие вещи, проверенные временем) схожи с Перлом. Взять к примеру Питон, который не похож ни на один язык программирования, как будто написание программ на нем далеко не главная возможность этого языка. Даже Ява скрипт на Перл и на Си похож!!!! А гребанная табуляция и отсутствие точки с запятой вызывает тошноту от этого «Языка программирования». Перл рулит, Перл жив и будет жить дольше всяких жалких питонов!!! Всех с праздником!!!

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

сделать свой оператор | чтобы писать конвееры в духе f3 | f2 | f1

можно попробовать в C++ извратиться. А смысл? Писать однострок на C++?

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

Именно в силу лёгкости, очевидно, Perl и является самым популярным скриптовым языком для веб-дизайна, системных скриптов и клиентского софта. Это отлично видно по изобилию CMS, написанных на перле, торрент-клиентов, инсталляторов операционной системы и т.д.

вовсе не по этому. Просто когда-то давно альтернативы попросту не было - shell это не альтернатива, ибо тормозит (дык оно для команд - это же shell. Для одной строчки на shell время 0.1сек не имеет значения). Что там ещё было? expect с его уродским синтаксисом? LISP, годный только для теоретиков? Или сишечка, которую компилять надо, что для одноразового скрипта просто глупо.

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

Инкапсуляция реализуется через «благословлённые» ссылки очень даже неплохо: мы абстрагируемся от данных объекта (в которые может разыменовываться ссылка) и действий объекта (в которые опять же разыменовывается ссылка).

это называется «нетипизированный указатель» и, очевидно, не имеет никакого отношения к ооп.

господи, и эти люди еще смеют осуждать использование отступов вместо скобочек и прочего синтаксического мусора?!!

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

Ибо нету лишних 5 лет, чтобы учить все его 100500 операторов.

Это вы сейчас про питон?

нет. достаточно совсем немного времени, что-бы освоить все операторы питона. Их там немного, ибо «один путь».

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

Инкапсуляция реализуется через «благословлённые» ссылки очень даже неплохо: мы абстрагируемся от данных объекта (в которые может разыменовываться ссылка) и действий объекта (в которые опять же разыменовывается ссылка). Наследование и полиморфизм реализуются опять же через них (см. механизм поиска функции, в которую разыменовывается блессованная ссылка). Вот тебе и ООП.

а... Ну такой «ООП» я могу и в сишечке юзать...

Инкапсуляцию я могу реализовать предавая клиенту только описания структуры. А определение я скрою в своих *.c файлах. Полиморфизм можно реализовать через void*, который можно куда угодно преобразовать. также и наследование...

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

А смысл?

В данном случае для скриптинга. Без пайплайнов нет жизни в юниксах.

Что бы не было костылей типа этого: http://amoffat.github.com/sh/#piping . Можно в питоне написать свой __or__, но это кривой и неудобный метод.

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

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

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

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

достаточно совсем немного времени, что-бы освоить все операторы питона. Их там немного, ибо «один путь».

А теперь давай посмотрим что будет если этот путь пролегает в стороне от того что тебе нужно:

# we're being run as a stand-alone script, fire up a REPL
if __name__ == "__main__":
    globs = globals()
    f_globals = {}
    for k in ["__builtins__", "__doc__", "__name__", "__package__"]:
        f_globals[k] = globs[k]
    env = Environment(f_globals)
    run_repl(env)

# we're being imported from somewhere
else:
    frame, script, line, module, code, index = inspect.stack()[1]
    env = Environment(frame.f_globals)


    # are we being imported from a REPL?
    if script.startswith("<") and script.endswith(">") :
        self = sys.modules[__name__]
        sys.modules[__name__] = SelfWrapper(self)

    # we're being imported from a script
    else:

        # we need to analyze how we were imported
        with open(script, "r") as h: source = h.readlines()
        import_line = source[line-1]

        # this it the most magical choice.  basically we're trying to import
        # all of the system programs into our script.  the only way to do
        # this is going to be to exec the source in modified global scope.
        # there might be a less magical way to do this...
        if "*" in import_line:
            # do not let us import * from anywhere but a stand-alone script
            if frame.f_globals["__name__"] != "__main__":
                raise RuntimeError("Cannot import * from anywhere other than \
a stand-alone script.  Do a 'from pbs import program' instead. Please see \
\"Limitations\" here: %s" % PROJECT_URL)

            warnings.warn("Importing * from pbs is magical and therefore has \
some limitations.  Please become familiar with them under \"Limitations\" \
here: %s  To avoid this warning, use a warning filter or import your \
programs directly with \"from pbs import <program>\"" % PROJECT_URL,
RuntimeWarning, stacklevel=2)

            # we avoid recursion by removing the line that imports us :)
            source = "".join(source[line:])

            exit_code = 0
            try: exec(source, env, env)
            except SystemExit as e: exit_code = e.code
            except: print(traceback.format_exc())

            # we exit so we don't actually run the script that we were imported
            # from (which would be running it "again", since we just executed
            # the script with exec
            exit(exit_code)

        # this is the least magical choice.  we're importing either a
        # selection of programs or we're just importing the pbs module.
        # in this case, let's just wrap ourselves with a module that has
        # __getattr__ so our program lookups can be done there
        else:
            self = sys.modules[__name__]
            sys.modules[__name__] = SelfWrapper(self)

Сможешь понять что оно делает?

На самом деле есть способ гораздо проще, но суть не меняется: простота она бывает обманчива. Вроде, питон простой язык, но не всегда простые вещи просто делаются. Т.е. он может сильно ограничивать полёт фантазии.

true_admin
()
Последнее исправление: true_admin (всего исправлений: 1)

Слава языку богов Вуду! Очень хороший язык.

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

А что не так с массивами в Си? Замечательно же всё

у нас в сишечке с массивами всё хорошо - их просто нет. Есть константные указатели на память, которые можно двигать вперёд и назад, имитируя поведение индексов одномерного массива. Ещё можно выделить кусок памяти на N байт (N - это ТОЛЬКО целая константа), вот только вернуть и передать этот «массив» никуда нельзя - передаётся указатель.

Есть сахарок array[index], весело пугать ньюбов записав index[array] - когнитивный диссонанс гарантирован...

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

Действительно, замечательно. Нет массивов - нет проблем!

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

вот только вернуть и передать этот «массив» никуда нельзя - передаётся указатель.

по-моему, можно вернуть структуру. А в структуре сделать struct Array{int array[];};. В результате когда вернёшь структуру она вернётся вместе массивом.

А может я не прав ^_^

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

И как же поможет end понять, что к чему относится?

я хз, спроси адептов скобочек

Не знаю, можно ли меня назвать адептом скобочек, но в vim'е по сишным скобкам ( {} ) очень удобная навигация - по «%» ( shift + 5 ) перепрыгивает на парную скобку. Не надо напрягаться чтобы понять где границы блока, даже если автором изучаемого кода был наркоман.

Хз можно ли так сделать для begin/end и тем более для отступов. Для отступов разве что folding будер работать. И причём в языках с отступами авторы-наркоманы в блок кода вставляют комментарии, начинающиеся не с отступа, а с начала строки, и фолдинг не спасает.

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

это называется «нетипизированный указатель» и, очевидно, не имеет никакого отношения к ооп.

Один и тот же нетипизированный указатель способен разыменовываться в десяток функций и хеш данных одновременно?

господи, и эти люди еще смеют осуждать использование отступов вместо скобочек и прочего синтаксического мусора?!!

Я не осуждаю эту особенность пайтона. Мне она даже кажется интересной.

helios
()

Поздравляю. Вот бы его из кед и гита выковыряли, я бы тогда его из генты вычистил.

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

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

на этот случай есть perltidy

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

а... Ну такой «ООП» я могу и в сишечке юзать...

Я не против :)

Важно, что механизм благословлённой ссылки шире каноничного ООП, что позволяет реализовать последнее, не просев по производительности без eval'ов и прочего.

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

Ларри учёл уроки отцов-основателей, и просто обдолбался шышек, и за одну ночь придумал сразу списки, массивы, и хеши

Пфф, сразу видно - с перлом не знаком или с чем-то его попутал. Что ты понимаешь под списком? И в чём по-твоему его отличие от массива? ;)

Кстати, ассоциативный массив ( хэш ) - архиудобная в использовании вещь. По сути - просто хранилище «key» -> «value». С array и hash быстро и легко строятся любые структуры данных в памяти. Удобно при анализе данных.

router 👍👍
()
Ответ на: комментарий от drBatty

В этом месте принято радоваться :)

как она в фоне файлы стирает?

Один однострочник и, похоже, уже не «отмыться» :)
Радоваться тому, что верблюд рисует верблюдов... Да, так мало мне нужно для радости.

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

В данном случае для скриптинга. Без пайплайнов нет жизни в юниксах. Что бы не было костылей

пайпы в shell это на самом деле монады из ФП. Они в принципе не могут нормально ложиться на императивный ЯП. В перловке и в shell'е пайпы реализованы с помощью костыля-временного файла, который принципиально нельзя завернуть в машинный код, и который совершенно непереносим.

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

В перловке и в shell'е пайпы реализованы с помощью костыля-временного файла, который принципиально нельзя завернуть в машинный код

ух ты, я правильно понял что в моих линуксах пайпы не работают, а весь текст от одной программы к другой передаётся силой мысли Т-рвальдса?

, и который совершенно непереносим.

Хм... power shell видел?

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

Кстати, ассоциативный массив ( хэш ) - архиудобная в использовании вещь.

Не могу не плюсануть.

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

но не всегда простые вещи просто делаются

Viva la Perl, где простые вещи делаются просто, а сложные просто делаются :)

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

Один из наиболее адекватных, на фоне всяких недоподелок типа питона и руби.

Я не фанатик и знаю что язык выбирают исходя из задачи, но меня огорчает что в современном дистрибутиве линукса устанавливается всё больше интерпретаторов разных языков. Скоро их будет больше, чем команд в ассемблере для той самой архитектуры, где это крутится :\

router 👍👍
()
Ответ на: комментарий от flareguner

Только наркоман мог придумать задавать scope при помощи табуляций.


Не трож YAML/HAML!

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

по-моему, можно вернуть структуру. А в структуре сделать struct Array{int array[];};. В результате когда вернёшь структуру она вернётся вместе массивом.

можно накостылить:

#include <stdio.h>

typedef struct
{
	int a[10];
}a10;

void print_a10(a10 a)
{
	int j;
	for(j = 0; j < 10; j++)
		printf("%d\n", a.a[j]);
}

int main()
{
	a10 a;
	int j;
	for(j = 0; j < 10; j++)
		a.a[j] = j;
	print_a10(a);
	return 0;
}

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

Если убрать маркеры конца блока то

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

KRoN73
()

Кстати, за что я люблю Perl, так это за то что я, не будучи программистом, могу заставить комп решить задачу анализа данных любой сложности. Perl достаточно высокоуровневый, чтобы им мог пользоваться простой админ. И мочь ставить компу произвольные задачи, вместо того чтобы искать готовый софт как школота/скрипткиддисы.

За Perl!

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

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

Постоянно нужных - кому? На perl не пишут ОС'и, и для микроконтроллеров прошивки тоже. В нём более высокоуровневые операции. И, кстати, если вдруг возникнет необходимость обращаться к отдельным символам в строке, это можно сделать. Что такое слайсы в контексте ЯП - я вообще не в курсе.

router 👍👍
()
Ответ на: комментарий от flareguner

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

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

Хз можно ли так сделать для begin/end и тем более для отступов.

можно! Алгоритм тривиальный.

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