Уже несколько релизов как втащили Один Правильный, встроенный в ядро языка. Но и до того никакой проблемой это никогда не было. На каждом проекте всё равно всегда свой стиль и библиотеки, независимо от языка.
Ни тот, ни другой не “ищет её в тексте программы”, даже когда в том же Перле лексическое связывание (а это как раз типовой случай с my, на local писали более 30 лет назад) - делается это в стурктурах-хелперах байткода, полученного из AST. И в случае динамического скоупинга, как в примере с local, тоже не ищет - к каждой такой переменной просто привязывается “её собственный” теневой стек, к которому добавляются инструкции push в месте local и pop на закрывающей фигурной скобке блока (на самом деле стэки Перла устроены несколько иначе и сложнее, но концептуально всё те же save/restore вместо поиска каждый раз). Возможность реального поиска по стеку вызовов я видел только в Tcl (upvar сотоварищи).
Так это не $1 $2, а $_[1] $_[2] - совсем разные вещи! Ибо $1 $2 только в матчинге регэкспов, по большому счету (мы ж не в шелле). Ну и да, $_[1] будет только в каких-нибудь магических обертках, в обычных функциях назовут именами.
Для тупых не умеющих абстрагироваться от привычек (см. ниже, и вообще привычки это плохо) из других языков - с 5.36 по умолчанию, а до того под “use feature ‘signatures’” доступен синтаксис вида
Неа, это не криво, это УДОБНО. Это полный контроль над передаваемыми аргументами (чем-то напоминает Erlang), то есть можно вместо идиотизмов типа “перегрузка функций” обработать всё в одном месте: например, позволить субе быть как статической функцией, так и методом, принимать после обязательных параметров опциональный хэш в виде перечня key-value pairs, после которого опять же снова может быть что-то опциональное (которое мы просто проверим по типу концевых элементов, если они есть). То есть принимаем список и возвращаем список, наивысшая абстракция в стиле Lisp. Поэтому опытные перловики предпочитают приучиться к этому “старому” стилю, а не использовать сигнатуры “потому что стало можно”.
В десятых уже было всё хорошо. Да, умолчание осталось конечно же про ASCII - а как иначе совместимость со скриптами 30-летней давности (а я такие видел в проде в этом десятилетии) иметь? Но десятка прагм нету, просто utf8 где надо, да и всё. Последние багфиксы по теме уникода, кажется, были в 5.18 (то есть времён Очаковских до покоренья Крыма).
Хаха, и что вместо? Статически линковать всё в один огромный бинарь, как делают в Go или Rust? Спасибо, но нет, юниксы от этой глупости ушли еще более четверти века назад.
Unicode. В итоге первое растянулось на 20 лет (Perl 6, Raku), а второе - сделало бесполезной изрядную часть CPAN наследия, которой собственно и был силён язык в прежние годы
Ну вообще нет, не сделало. Мало где смогли добавить юникод настолько совместимым образом, что всё старое просто продолжило работать - в Python для этого потребовалось аж мажорную версию с 2 на 3 менять, до сих пор несовместимостями икается.
Если этот пост задумывался как реклама Перла, получилось не очень. Сравнивать синтаксис надо было не с Питоном, а с тем, из чего Perl и вырос - смесь Shell, sed, awk и Си. Эти задачи и стоило показывать, как он облегчает их, особенно на примере всяческих однострочников, а с Питоном сравнивать - это уже отдельная специальная олимпиада.
А что такое “модные” ? Свежие? Их есть (Beekeper хоть). Популярные среди разработчиков на данном языке? Их тоже есть, Mojolicious тот же (который потом портировали на JavaScript кстати).
И да, Perl не исчерпывается вебом, вон AnyEvent достаточно популярен, хотя возрастом уже порядка двух десятилетий.
Для кого-то новости фрагменты из документации, которые спрашивают на собеседованиях на перловика? Хотя тащемта любой человек, использовавший local в шелл-скриптах, поймет данный конкретный пример и без неё - а в них больше ничего и нету, в Перле же тридцать лет my есть, с котором поведение станет “ожидаемым” (это ведь был пример из разряда “смотрите как в этом языке неожиданно и неинтуитивно”, да?).
Для своих задач (те же тексты) он уже хорошо оптимизирован, видел сравнение кода на Go “в лоб”, которое оказалось в примерно 40 раз медленнее перлового решения той же задачи.
В любом практическом языке есть куча неинтуитвных странностей. Например, в Python - изучал его летом, с некоторой дичи просто остолбеневал. А зачем переназывать $1 $2 $3, если им сразу в регулярке можно дать человеческие имена?
Позволяет. Поддерживали. А Java не просто так в энтерпрайзе поселилась, а потому что её активно рекламировали и предназначалась она на замену C++ как более простой язык. И то сказать, уже более десяти лет ходит шутка про новый стандарты плюсов:
-rwxr-xr-x 1 root wheel 233M 16 апр. 19:45 /usr/local/bin/TelegramЧто всё равно ОЧЕНЬ много.
Под винду (во времена до WSL2) было удобно ставить git-bash - сразу не только grep/sed/awk, но и perl и vim (не говоря уже о собственно гите).
Чего?.. Вот уж про сигнатуры никогда проблем не слышал, как они могли “вбить гвоздь в крышку гроба”.
Уже несколько релизов как втащили Один Правильный, встроенный в ядро языка. Но и до того никакой проблемой это никогда не было. На каждом проекте всё равно всегда свой стиль и библиотеки, независимо от языка.
Ни тот, ни другой не “ищет её в тексте программы”, даже когда в том же Перле лексическое связывание (а это как раз типовой случай с
my, наlocalписали более 30 лет назад) - делается это в стурктурах-хелперах байткода, полученного из AST. И в случае динамического скоупинга, как в примере сlocal, тоже не ищет - к каждой такой переменной просто привязывается “её собственный” теневой стек, к которому добавляются инструкции push в местеlocalи pop на закрывающей фигурной скобке блока (на самом деле стэки Перла устроены несколько иначе и сложнее, но концептуально всё те же save/restore вместо поиска каждый раз). Возможность реального поиска по стеку вызовов я видел только в Tcl (upvarсотоварищи).Не огромный? Точно? Я вспоминаю Telegram Desktop на пару гигабайт в отладочной версии… щас уже наверняка куда больше.
Нет, не отличное это решение, а говно от кукловодов для идиотов.
Так это не $1 $2, а
$_[1] $_[2]- совсем разные вещи! Ибо $1 $2 только в матчинге регэкспов, по большому счету (мы ж не в шелле). Ну и да,$_[1]будет только в каких-нибудь магических обертках, в обычных функциях назовут именами.Для
тупыхне умеющих абстрагироваться от привычек (см. ниже, и вообще привычки это плохо) из других языков - с 5.36 по умолчанию, а до того под “use feature ‘signatures’” доступен синтаксис видаНеа, это не криво, это УДОБНО. Это полный контроль над передаваемыми аргументами (чем-то напоминает Erlang), то есть можно вместо идиотизмов типа “перегрузка функций” обработать всё в одном месте: например, позволить субе быть как статической функцией, так и методом, принимать после обязательных параметров опциональный хэш в виде перечня key-value pairs, после которого опять же снова может быть что-то опциональное (которое мы просто проверим по типу концевых элементов, если они есть). То есть принимаем список и возвращаем список, наивысшая абстракция в стиле Lisp. Поэтому опытные перловики предпочитают приучиться к этому “старому” стилю, а не использовать сигнатуры “потому что стало можно”.
В десятых уже было всё хорошо. Да, умолчание осталось конечно же про ASCII - а как иначе совместимость со скриптами 30-летней давности (а я такие видел в проде в этом десятилетии) иметь? Но десятка прагм нету, просто utf8 где надо, да и всё. Последние багфиксы по теме уникода, кажется, были в 5.18 (то есть времён Очаковских до покоренья Крыма).
Хаха, и что вместо? Статически линковать всё в один огромный бинарь, как делают в Go или Rust? Спасибо, но нет, юниксы от этой глупости ушли еще более четверти века назад.
А причем тут тогда Перл? Такое будет и в любом другом динамическом языке, хоть бидоне, хоть жабаскрипте.
Зачем страдать “встроенными”, если можно проще? Вся мощь что перла, что фряхи - в легкой инсталляции нужных сторонних пакетов.
Ну вообще нет, не сделало. Мало где смогли добавить юникод настолько совместимым образом, что всё старое просто продолжило работать - в Python для этого потребовалось аж мажорную версию с 2 на 3 менять, до сих пор несовместимостями икается.
Если этот пост задумывался как реклама Перла, получилось не очень. Сравнивать синтаксис надо было не с Питоном, а с тем, из чего Perl и вырос - смесь Shell, sed, awk и Си. Эти задачи и стоило показывать, как он облегчает их, особенно на примере всяческих однострочников, а с Питоном сравнивать - это уже отдельная специальная олимпиада.
А что такое “модные” ? Свежие? Их есть (Beekeper хоть). Популярные среди разработчиков на данном языке? Их тоже есть, Mojolicious тот же (который потом портировали на JavaScript кстати).
И да, Perl не исчерпывается вебом, вон AnyEvent достаточно популярен, хотя возрастом уже порядка двух десятилетий.
Это то, что было под названием Perl 6. А пятый так и остался теперь снова единственный perl.
Для кого-то новости фрагменты из документации, которые спрашивают на собеседованиях на перловика? Хотя тащемта любой человек, использовавший
localв шелл-скриптах, поймет данный конкретный пример и без неё - а в них больше ничего и нету, в Перле же тридцать летmyесть, с котором поведение станет “ожидаемым” (это ведь был пример из разряда “смотрите как в этом языке неожиданно и неинтуитивно”, да?).Для своих задач (те же тексты) он уже хорошо оптимизирован, видел сравнение кода на Go “в лоб”, которое оказалось в примерно 40 раз медленнее перлового решения той же задачи.
Зачем -MCPAN, если можно
cpan -I -i? И установить local::lib конечно.В любом практическом языке есть куча неинтуитвных странностей. Например, в Python - изучал его летом, с некоторой дичи просто остолбеневал. А зачем переназывать $1 $2 $3, если им сразу в регулярке можно дать человеческие имена?
Позволяет. Поддерживали. А Java не просто так в энтерпрайзе поселилась, а потому что её активно рекламировали и предназначалась она на замену C++ как более простой язык. И то сказать, уже более десяти лет ходит шутка про новый стандарты плюсов:
…и знаете, Перл гораздо читабельнее вот этого!