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 ()
Ответ на: комментарий от sv75

А вот еще задачка вывести на печать массив без повторяющихся в нем элементов:

print join "," => grep {!$_{$_}++} @mass;

это можно так-же коротко сделать в питоне?

vilfred ☆☆
()
Ответ на: комментарий от xargs

> например смена перечня родительских классов объекта налету

Запросто:

# ==== class A(object): def say(self): print 'Hello',

class B(object): def say(self): print 'world!'

obj = A() obj.say() obj.__class__ = B obj.say() # ====

Вывод:

Hello world!

И еще по разному извратиться можно:

# ==== class A(object): def say(self): print 'Hello',

class B(object): def say(self): print 'world!'

class C(object): def sayC(self): print 'Say from C'

def test(): o = A() class _tmpClass(A, B, C):pass

o.__class__ = _tmpClass o.say() B.say(o) o.sayC()

test() # ====

Вывод:

Hello world! Say from C

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

переключаясь в любой package что в нем хочу, то и добавляю

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

> например смена перечня родительских классов объекта налету

Запросто:

# ====
class A(object):
    def say(self):
        print 'Hello',

class B(object):
    def say(self):
        print 'world!'

obj = A()
obj.say()
obj.__class__ = B
obj.say()
# ====

Вывод:

Hello world!

И еще по разному извратиться можно:

# ====
class A(object):
    def say(self):
        print 'Hello',

class B(object):
    def say(self):
        print 'world!'

class C(object):
    def sayC(self):
        print 'Say from C'

def test():
    o = A()
    class _tmpClass(A, B, C):pass

    o.__class__ = _tmpClass
    o.say()
    B.say(o)
    o.sayC()

test()
# ====

Вывод:

Hello world!
Say from C


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

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

Можно, причем на порядок понятнее

>>> a = [1, 1, 2, 0, 1, -1, "hello", "world", "hello"]
>>> print ', '.join(map(str, set(a)))
0, 1, 2, world, hello, -1

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

> ради исскуства =)

тогда уточни задание - все _последовательные_ элементы схлопываются в один? или вообще все?

[1, 2, 2, 3, 4, 3, 5] => ...?

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

еще одно задание и скажу к чему это в смысле исскуства.

vilfred ☆☆
()
Ответ на: удаленный комментарий

> # change class of object $x from X to Y

> bless $x, 'Y';

что интересно, в самом перле это прекрасно работает, вот если такое делать в XS, то при print $x; можно получить 'X::Y::SCALAR(0xQWQWQWQW)'

т.е. на С такой проверки не делает

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

>ok, а например убрать повторения подстрок(например цифры) из массива? >print join "," => grep {!$_{$1}++ if /^.*?x(\d)x.*?$/} @mass;

можно по-русски, че надо-то сделать, а то перл трудно выкупать?

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

ну ладно, не важно оно, бог с ним с заданием... ну допустим у тебя есть массив и строк, в которых иногда встречается одинаковая цифра (хотя строки разные). Ну вот хочется выпечатать строчки, где одинаковые цифры.

Собственно я к чему, "легким движением руки" функции строки меняется из одного в другое, т.е. как бы удобство чтоли.

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

> print join "," => grep {!$_{$1}++ if /^.*?x(\d)x.*?$/} @mass;

Угу, и если ты забудешь прокомментировать эту строчку, то через полгода будешь ломать голову: "что ж я тут хотел сделать...". А если полпроекта из подобного кода состоит, причём писал этот код не ты, то вообще убиться можно. А так, да - Перл всех рвёт на однострочниках, этого не отнять.

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

> Можно, причем на порядок понятнее > [1, 1, 2, 0, 1, -1, "hello", "world", "hello"] > 0, 1, 2, world, hello, -1

Так ведь неверная это имплементация. Оригинальный порядок потерян.

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

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

Говори по-русски. Твои косноязычные задания не ясны.

Ты что, хочешь доказать что в перле можно сооружать нечитаемые однострочники? Да с этим никто не спорит конечно.

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

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

>Ты наверно думаешь, что регекспы только в Перле имеются :)

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

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

Тут кто-то про идеологию выпытывал, имхо идеология перла - быстрое ленивое программирование. А узнавая его глубже наступает просветление, знаешь в каком я был воссторге когда прочитал про то что дает my $a = $b % $c; :-) Просто приятный синтаксис, за что, за что вы его так ненавидите, это же божественно %) Недаром лингвист писал %)

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

>Другое дело, что в реальном мире код куда чаще читают, чем пишут. И с этой точки зрения подобные перлохаки просто отвратительны.

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

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

> Так ведь неверная это имплементация. Оригинальный порядок потерян.

print ','.join(str(x) for i,x in enumerate(mass) if mass.index(x)==i)

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

> Так ведь неверная это имплементация. Оригинальный порядок потерян.

Да, Перл крут для однострочных конструкций - которые понять нормальным людям невозможно. Да, нету в Питоне $_ etc. Зато код можно понять без спирта даже.

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

> Просто приятный синтаксис, за что, за что вы его так ненавидите, это же божественно %) Недаром лингвист писал %)

это наверное единственный язык, который разработал лингвист.

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

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

> Так ведь неверная это имплементация. Оригинальный порядок потерян.

Да, Перл крут для однострочных конструкций - которые понять нормальным людям невозможно. Да, нету в Питоне $_ etc. Зато код можно понять без спирта даже. У меня вот так получилось из голову.

l = [1, 2, 3, 2, 4]
tmp = []; print [n for n in l if (not tmp.append(n)) and tmp.count(n)==1]

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

> меньше информации на экране (символьной) - проще парсить мозгу %)

Наивно думать, что мозг парсит побайтно.

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

> print ','.join(str(x) for i,x in enumerate(mass) if mass.index(x)==i)

А, вот правильный ответ. Правда если быть точным, то это не работает unmuttable sequences.

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

Хотя в китайском вообще -- тоже нет строгости в расположении, но в нём даже 1 слово в зависимости от интонации имеет до 4 смыслов.

ЗЫ английский язык в лингвистике относят ко 2-му поколению языков, русский, латинский и китайский -- к 3-му.

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

> английский язык в лингвистике относят ко 2-му поколению языков, русский, латинский и китайский -- к 3-му.

Нет в лингвистике такого деления. Откуда это вообще?

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

>ЗЫ английский язык в лингвистике относят ко 2-му поколению языков, русский, латинский и китайский -- к 3-му.

интересно... где про это можно прочитать?

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

> ЗЫ английский язык в лингвистике относят ко 2-му поколению языков, русский, латинский и китайский -- к 3-му.

гугль об этом не в курсе, у меня нехорошие подозрения...

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

> Нет в лингвистике такого деления. Откуда это вообще?

у меня жена филолог/языковед, преподаватель рус+англ+литературы, канд.филолог.наук, она и сообщила

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

>> На питоне никак. Зато на руби вот: 

>А что, разве в Питоне палками кидаться запрещено?

Не знаю что такое палки, может это исключения? Эта конструкция не использует исключения. Исключения в руби используются так:

begin
    bla
rescue BLA
    bla
end

Или для всего метода:

def method
    bla
rescue
    bla
ensure
    bla
end

^
| вот это тоже жирный плюс руби. Почему до этого не додумались другие??

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

> где про это можно прочитать?

Присоединяюсь.

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

1-й уровень -- не имеет абстрактных понятий, строится только из простых предложений

2-й -- все части речи строго предопределены и их расположение меняет смысл сказанного

3-й -- все слова самодостаточны, независимы и могут сами нести смысловую без дополнительных вспомогательных частей (в английском нет такого кол-ва приставок, суффиксов и окончаний)

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

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

Допустим что такая классификация есть и прослеживаются там какие-то признаки. Однако никто не сказал что 3е поколение языков каким-то образом лучше 2го.

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

> Однако никто не сказал что 3е поколение языков каким-то образом лучше 2го.

Разве это кто-то утверждал? А с точки зрения NLP - так второе гораздо лучше третьего (а первое еще лучше!) :)

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

Ок, спасибо за инфу. Выше постил ещё не видя ответа.

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

Я конечно не спец в лингвистике, но сдаётся мне, что языки (по крайней мере индоевропейские) развиваются от сложных к простым. Одно время я изучал церковно-славянский ради интереса. Так вот он намного сложнее современного русского. Там, к примеру, у глаголов 4 формы прошедшего времени, 3 формы будущего, 3 именные формы. У существительных есть двойственное число с особыми правилами склонения, есть звательный падеж, полные и краткие прилагательные, ну и множество других мелких заморочек. Правила согласования слов в предложении тоже весьма громоздкие. Вообще, чем древнее язык, тем он сложнее. Санскрит считается самым сложным из всех индоевропейских языков. А древнегреческий, кстати, подвергся упрощению по мере развития цивилизации. То же самое к английскому применимо.

Вообще, ваша классификация несколько необычна. Я вот знаю, что языки делят на флективные и агглютативные по словоизменению, а также на синтетические и аналитические по согласованию слов в предложении. Но чтобы среди них выделяли какие то стадии/уровни, не слышал такого.

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

>> прочитал про то что дает my $a = $b % $c >А что оно такого даёт?

Ну ... как это по русски называется, например 5 % 2 даст тебе 1. И с % это пример просто удобности синтаксиса, в языке подобных мелочей дохрена, вкупе это дает очень "широкую гибкость" и мощь :=) В общем рекомендую посмотреть хотя бы эти две книжки:

http://schneeflocke.org/scrum/tmp2/it/perl/programming_on_perl.djvu http://schneeflocke.org/scrum/tmp2/it/perl/mastering%20regular%20expressions%...(rus,%20piter%202003).djvu

а можно и эту заодно:

http://schneeflocke.org/scrum/tmp2/it/perl/perl_bib.pdf

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

>Я конечно не спец в лингвистике, но сдаётся мне, что языки (по крайней мере индоевропейские) развиваются от сложных к простым.

Ты прав, все идет к глобализации и упрощению, только радоваться этому я особо не стал бы, классический пример - американский сленговый английский... это же жесть <b>ваще</b>... Сейчас и русский туда же <b>катиццо</b>

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

> 3-й -- все слова самодостаточны, независимы и могут сами нести смысловую без дополнительных вспомогательных частей (в английском нет такого кол-ва приставок, суффиксов и окончаний)

Это описание синтетического языка в противопоставлении аналитическому? Тогда нет никаких оснований считать, что 3-й уровень круче 2-го.

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

> Я конечно не спец в лингвистике, но сдаётся мне, что языки (по крайней мере индоевропейские) развиваются от сложных к простым.

Тогда сначал должна была сначала возникнуть "сложность", чтобы было что упрощать. И почему случился переход от усложнения к упрощению?

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

> Ты прав, все идет к глобализации и упрощению, только радоваться этому я особо не стал бы, классический пример - американский сленговый английский...

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

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

> Тогда сначал должна была сначала возникнуть "сложность", чтобы было что упрощать. И почему случился переход от усложнения к упрощению?

А я почём знаю? :) Это нужно у древних ариев спрашивать. Но то, что санскрит много сложнее всех современных индоевропейских языков - факт.

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

> Это описание синтетического языка в противопоставлении аналитическому?

Степень зависимости значения от контекста?

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

> tmp = []; print [n for n in l if (not tmp.append(n)) and tmp.count(n)==1]

Да, list comprehensions всяко приятнее монструозных регекспов. Думается мне, любители Перла сильно недооценивают возможности Питона. Хотя некоторые питоновские ограничения меня тоже бесят.

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

> Ну ... как это по русски называется, например 5 % 2 даст тебе 1.

Все, кто учился в начальной школе, называют это "остаток от деления". Что характерно, оператор "%" для вычисления остатка используется ещё и в Awk, B, C, C#, C++, D, E, Io, Java, JavaScript, PHP, Pliant, Pike, Python, Ruby, REXX, Tcl, Yorick. Чем тут перл выделяется - непонятно.

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

>> Это описание синтетического языка в противопоставлении аналитическому?

> Степень зависимости значения от контекста?

Скорее разные способы согласования слов в предложении. Хотя можно говорить и о зависимости от контекста. Для синтетических языков контекст менее значим, потому что зачастую можно определить значение слова просто по его форме. Оттого и такая вольность при построении предложений. Но я бы не стал утверждать, что от этого язык становится более "продвинутым".

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

> Не знаю что такое палки, может это исключения? Эта конструкция не использует исключения.

Зато Питону ничто не мешает использовать для этих целей исключения.

Опять же, зачем в Руби механизм кидания палок, если это не исключения? Эклектика?

> вот это тоже жирный плюс руби. Почему до этого не додумались другие??

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

Хотя задумка, не скрою, весьма полезная...

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