1. Perl / Говнокод #26798

    0

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    # The API methods die when an error occurs.
    say $api->getMe->{result}{username};
    # ... but error handling is available as well.
    my $result = eval { $api->getMe }
        or die 'Got error message: ', $api->parse_error->{msg};

    https://metacpan.org/pod/WWW::Telegram::BotAPI

    Продолжаем пиздеть про перл.

    Решил выбрать предметную область "Телеграм-бот" чтобы поднатаскаться в «Perl».

    Вопрос: что за говно в оп-коде? Это говноспособ обработки ошибок предлагают, или такое распространено? Типа eval вместо try?

    Запостил: vistefan, 09 Июля 2020

    Комментарии (74) RSS

    • >username
      barewords? и это работает с use strict?

      eval вместо try это нормальная практика, но если ты все равно собрался die, то зачем что-то ловить?
      Ответить
      • Чтобы показать своё сообщеие об ошибке.
        Ответить
        • Зачем? Зачем? die и так выводит сообщение об ошибке
          Ответить
          • > Чтобы показать своё сообщеие об ошибке.
            Ответить
            • Зачем? Зачем?
              Ответить
              • Чтобы показать своё сообщеие об ошибке.

                Например где-то при вычислении количества питушни в питушне происходит деление на зиро, и вместо того, чтобы говорит о каком-то хуй пойми чего-на-что делении я хочу сказать внятное, что мне не дали питушню.
                Ответить
                • Чтобы вместо: "Division by zero" было внятное "Can't divide number of users by zero" или например "Your system administrator tried to divide some number by zero, call him and ask what the fuck".
                  Ответить
                • Ты прав, питуз
                  eval {
                      print 100 / $ARGV[0];
                  };
                  die "Sorry, but [email protected]" if [email protected] ne '';
                  Ответить
                  • > if [email protected] ne

                    Заебись, лооол

                    Всегда завидовал англоязычным людям, что мол для них имена сущностей и ключевые слова в языках, имена функций в либах — как-то роднее. И пожалуйста, вот тебе перл — иностранный агент — реализует буквально концепт ЕСЛИ НЕ из 1С )))
                    Ответить
                    • А ещё я люблю языки, в которых можно булям ставить знак вопроса в конце имени, и традицию именовать интерфейсы в джавке с префиксом IHave. I — это типа интерфейс, а читакется как IHaveDate, IHaveContracts или например IAmDisplayable, IAmPrintable.
                      Ответить
                      • >, в которых можно булям ставить знак вопроса в конце имени
                        Ruby же:)
                        puts "A".empty? # false

                        А методы, которые что-то меняют, имеют в конце "!"
                        ar = [1,2,3]
                        ar.sort!


                        >в джавке с префиксом IHave
                        Такая традиция есть в C++ на винде и C# , в джава ее вроде нет.
                        Ответить
                        • А я как раз в джавовском проекте на работе её встретил. А больше нигде не видел.

                          Там основу фреймворка ещё до появления их зоопарка, разделения бэка и фронта в вебе на клиент и сервер, и вообще технологии «AJAX», писал очень писучий чувак, который потом ушел в яндекс, и у него как раз мог быть ЦППшный опыт, наверное подрезал фишку.
                          Ответить
                          • Посмотри на стандарлибу жабы: нету там такого.
                            Чувак видимо принес это из C# или C++ (скорее всего).
                            Ответить
                            • именно оттуда, ведь это отголоски венгерской (петушиной) нотации, которую в джаве отродясь не применяли, в отличие от С/С++
                              Ответить
                      • А мне нравится, когда таблицы обозначают префиксом «tbl», потому что читается как «ты».
                        Ответить
                        • tbl_pitux
                          Ответить
                        • Блядь. Нахуй ты это написал?
                          Ответить
                          • развидь
                            Ответить
                            • Есть ещё сокращение «Analytics» -> «Anal».
                              Ответить
                              • https://jira.atlassian.com/browse/JRASERVER-65811
                                Ответить
                              • /* meta */
                                typedef struct r_anal_meta_item_t {
                                	ut64 from;
                                	ut64 to;
                                	ut64 size;
                                	int type;
                                	int subtype;
                                	char *str;
                                	int space;
                                } RAnalMetaItem;
                                
                                typedef struct {
                                	struct r_anal_t *anal;
                                	int type;
                                	int rad;
                                	SdbForeachCallback cb;
                                	void *user;
                                	int count;
                                	struct r_anal_type_function_t *fcn;
                                } RAnalMetaUserItem;
                                
                                typedef struct r_anal_range_t {
                                	ut64 from;
                                	ut64 to;
                                	int bits;
                                } RAnalRange;
                                
                                #define R_ANAL_UNMASK_TYPE(x) (x&R_ANAL_VAR_TYPE_SIZE_MASK)
                                #define R_ANAL_UNMASK_SIGN(x) (((x& R_ANAL_VAR_TYPE_SIGN_MASK)>> R_ANAL_VAR_TYPE_SIGN_SHIFT)==R_ANAL_VAR_TYPE_UNSIGNED)?0:1
                                
                                #define R_ANAL_GET_OFFSET(x,y,z) \
                                	(x && x->binb.bin && x->binb.get_offset)? \
                                		x->binb.get_offset (x->binb.bin, y, z): -1
                                enum {
                                	R_ANAL_DATA_TYPE_NULL = 0,
                                	R_ANAL_DATA_TYPE_UNKNOWN = 1,
                                	R_ANAL_DATA_TYPE_STRING = 2,
                                	R_ANAL_DATA_TYPE_WIDE_STRING = 3,
                                	R_ANAL_DATA_TYPE_POINTER = 4,
                                	R_ANAL_DATA_TYPE_NUMBER = 5,
                                	R_ANAL_DATA_TYPE_INVALID = 6,
                                	R_ANAL_DATA_TYPE_HEADER = 7,
                                	R_ANAL_DATA_TYPE_SEQUENCE = 8,
                                	R_ANAL_DATA_TYPE_PATTERN = 9,
                                };
                                
                                // used from core/anal.c
                                #define R_ANAL_ADDR_TYPE_EXEC      1
                                #define R_ANAL_ADDR_TYPE_READ      1 << 1
                                #define R_ANAL_ADDR_TYPE_WRITE     1 << 2
                                #define R_ANAL_ADDR_TYPE_FLAG      1 << 3
                                #define R_ANAL_ADDR_TYPE_FUNC      1 << 4
                                #define R_ANAL_ADDR_TYPE_HEAP      1 << 5
                                #define R_ANAL_ADDR_TYPE_STACK     1 << 6
                                #define R_ANAL_ADDR_TYPE_REG       1 << 7
                                #define R_ANAL_ADDR_TYPE_PROGRAM   1 << 8
                                #define R_ANAL_ADDR_TYPE_LIBRARY   1 << 9
                                #define R_ANAL_ADDR_TYPE_ASCII     1 << 10
                                #define R_ANAL_ADDR_TYPE_SEQUENCE  1 << 11
                                
                                #define R_ANAL_ARCHINFO_MIN_OP_SIZE 0
                                #define R_ANAL_ARCHINFO_MAX_OP_SIZE 1
                                #define R_ANAL_ARCHINFO_ALIGN 2
                                #define R_ANAL_ARCHINFO_DATA_ALIGN 4
                                Ответить
                          • В каком-то проекте встретилось, и теперь ты думаешь, что идентификаторы обращаются к тебе?
                            Ответить
                    • В перле ne отличается от != по той же причине, по какой она отличается в шеле.

                      В перле в рантайме не отличается строка от числа: скаляр и есть скаляр (точнее внутри отличаетcя, но это делать реализации).

                      В итоге перегрузить оператор по типам операндов нельзя.
                      Так что нужно явно отличать eq/ne от =/!=
                      Ответить
                      • Ну то есть у аргументов типов нет, типы есть у операторов. Если оператор строковый, то он может привести аргументы к строкам; если оператор числовой, то он может привести аргументы к числам.

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

                        Так?
                        Ответить
                        • Кажется что да, именно так.

                          Можно чтать из файла и складывать, не надо кастить как питухонские делают
                          Ответить
                  • кстати, можно просто
                    die "Sorry, but [email protected]" if [email protected];
                    ;
                    но критик ругается
                    Ответить
                    • кто такой критик?
                      Ответить
                      • Perl::Critic. Статический анализатор перлокода на основе парсера PPI и книги Конвея "Perl Best Practices".
                        Ответить
                        • Ты просто делаешь use, и он начинает в твоей программе статически анализировать при запуске? Как же это работает, и на какой стадии?
                          Ответить
                          • Будем считать что заванишил, вижу он юзается явно, ему кормишь файлы.
                            Ответить
                            • точно так) можно на CI запускать. Как rubocop или pep8 или lintовщики.

                              плагин к intellij (весьма неплохой) умеет им ошибки подсвечивать
                              Ответить
                              • а ты вообще я так понимаю перлишь по работе? чо там в проде, всё та же идея?
                                Ответить
                                • лол, нет:) Я перлю разве что чисто для себя, или однострочники в командной строке. Коллеги меня убют, если я буду перлить.

                                  В проде это в смысле где? Из вебфреймворков можешь глянуть на catalyst.
                                  Ответить
      • >barewords? и это работает с use strict?
        мильпардон, всё работает.

        barewords нельзя вместо строковых тилиралов, а заместо ключей хеша это ок.
        Ответить
    • > Типа eval вместо try?
      Если мне не изменяет память (а она может, шалунья), в «Перле» нет «классических» блоков try-catch, и вместо них используется как раз «eval».
      Ответить
      • Всё так.

        die приводит к завершению прогшрамы, но можно завернуть код в eval, и потом считать ошибку в [email protected]
        Ответить
        • Ну, красоту этого подхода мне пока разглядеть трудно.
          Ответить
          • Красота в совместимости со старым кодом.

            Вот был у тебя код, который просто помирал при ошибках. А теперь ты можешь его завернуть в eval и обработать ошибку. Даже новый кейворд добавлять не пришлось в язык. И в старом коде не надо менять die на throw.
            Ответить
            • >кейворд
              ки
              киворд же.

              Откуда вообще взялось "кей"?

              Кей это персонаж пьесы Шварца "Снежная Королева" (не путать с оригинальной сказкой Андерсена -- в её переводах он обычно Кай)
              Ответить
            • Да, действительно красиво. Подтверждаю.
              Ответить
          • в 98% случаев ошибку ловить не нужно.
            Ответить
      • Это каждый 40-летний петух знает.
        Ответить
    • По-моему, чтобы поднатаскаться в Perl нужно писать парсеры.
      Этот язык для того и создан, чтобы обрабатывать строки.
      Ответить
      • Парсер языка с одним nand а качестве операции.
        Ответить
        • Собираешь из nand'ов память и какой-нибудь risc'овый проц. Конпеляешь под него пёрл. И задача сводится к предыдущей.
          Ответить
          • Пиши парсеры на перле, сцук. А то будешь за 300 р на C# парсить https://bit.ly/300Iwsu
            Ответить
            • там забавные объявы

              Репетиторша по пайтону за 1000 рублей, шутки программисты за 300...
              Ответить
              • Хм, в час?
                Ответить
                • Прикинем... Пусть 40 часов в неделю, тогда за 4 недели можно заработать 160×300 = 48 тысяч. С учётом того, что «средний класс» начинается от 17 т. р. в месяц, это неплохо.
                  Ответить
                  • Таким 40 часов в неделю не получится заниматься.
                    Ответить
                    • Будем честны: никто в мире не работает 40 часов в неделю.
                      Процентов 10 времени все пинают хуй.
                      Правда некоторые могут в свободное время что-то изучать или подпиливать
                      Ответить
                    • https://avatars.mds.yandex.net/get-zen_pictures/2995007/895256060-1592312722728/orig
                      Ответить
                • Видимо за задачу.
                  Чувак пишет:
                  "Пишу не большие программы. " Я дальше читать из пугался.

                  А питонистка видимо штуку за занятие берет. Имхо, норм
                  Ответить
                  • А у неё второй или третий?

                    З.Ы. Я о питоне если что.
                    Ответить
              • Научит владеть своим/чужим питоном?
                Ответить
                • Вот что вот за шовинизм? Если бы это была не преподавательница, а преподаватель, вы бы так не шутили!!
                  Ответить
          • Сразу видно, что ты математик.
            Ответить
          • > проц. Конпеляешь под него пёрл.

            Пропущен шаг "реализовываешь для него бекенд для компилятора си", лол
            Ответить
            • Ну ок, если хочется попердолиться по полной - можно и так.

              Хотя можно просто выбрать опенсурсный проц, под который уже есть готовый бекенд. Тогда вообще ничего писать не нужно, разве что простенький конвертер из выхлопа синтезатора в твой язык. Скажешь синтезатору, что у тебя техпроцесс кроме nand'а ничего не умеет да и всё.
              Ответить

    Добавить комментарий