=()= / Говнокод #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 vistefan, (Updated )

Комментарии (88) 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 $@" if $@ ne '';
                Ответить
                • > if $@ 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», потому что читается как «ты».
                      Ответить
                            • /* 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 $@" if $@;
                  ;
                  но критик ругается
                  Ответить
                    • Perl::Critic. Статический анализатор перлокода на основе парсера PPI и книги Конвея "Perl Best Practices".
                      Ответить
                      • Ты просто делаешь use, и он начинает в твоей программе статически анализировать при запуске? Как же это работает, и на какой стадии?
                        Ответить
                        • Будем считать что заванишил, вижу он юзается явно, ему кормишь файлы.
                          Ответить
                          • точно так) можно на CI запускать. Как rubocop или pep8 или lintовщики.

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

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

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

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

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

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

            Кей это персонаж пьесы Шварца "Снежная Королева" (не путать с оригинальной сказкой Андерсена -- в её переводах он обычно Кай)
            Ответить
        • в 98% случаев ошибку ловить не нужно.
          Ответить
              • Написал член сообщества, где

                -принято дрочить на фантазии о измены жены;
                -дрочить на негров, которых вживую они скорее всего не видели;
                -жаловаться на женщин, что они не приходят и не дают сами;
                -наряжаться в женщин;
                -коллективно дрочить на собачьи хуи и конские залупы;
                -гнобить друг друга по кругу без какого-либо смысла.
                Ответить
                  • -жаловаться на женщин, что они не приходят и не дают сами;

                    Все тут именно такие.

                    -наряжаться в женщин;

                    bormand

                    Про остальное не буду писать, чтобы не раскрывать местных энтузиастов.
                    Ответить
                    • >>-жаловаться на женщин, что они не приходят и не дают сами;
                      какие инцелы ))

                      Пока одни женщин ебут, другие жалуются на них в Интернете
                      Ответить
  • По-моему, чтобы поднатаскаться в Perl нужно писать парсеры.
    Этот язык для того и создан, чтобы обрабатывать строки.
    Ответить
      • Собираешь из nand'ов память и какой-нибудь risc'овый проц. Конпеляешь под него пёрл. И задача сводится к предыдущей.
        Ответить
          • там забавные объявы

            Репетиторша по пайтону за 1000 рублей, шутки программисты за 300...
            Ответить
              • Прикинем... Пусть 40 часов в неделю, тогда за 4 недели можно заработать 160×300 = 48 тысяч. С учётом того, что «средний класс» начинается от 17 т. р. в месяц, это неплохо.
                Ответить
              • Видимо за задачу.
                Чувак пишет:
                "Пишу не большие программы. " Я дальше читать из пугался.

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

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

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

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8