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

    −159

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    if ("0 but true" == 0) {
        print "Zero! ";
    }
    if ("0 but true") {
        print "But true...";
    }

    The current default implementation always returns true without actually doing anything. Actually, it returns "0 but true" which is true but zero. That way you can tell if the return value is genuine or just the default.

    http://ideone.com/8FzrUI

    Zero! But true...

    Запостил: bormand, 27 Января 2014

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

    • СЛАБАЯ ТУПИЗАЦИЯ ТАКАЯ ТУПИЗАЦИЯ!!!

      http://ideone.com/m8JwDu
      Ответить
    • Продолжаем вынос мозга:
      print "test" eq "test" ? "Y\n" : "N\n";
      print ("test" eq "test") ? "Y\n" : "N\n";
      http://ideone.com/lN871W

      Ну тут хоть use warnings спас.
      Ответить
    • Астрологи обьявили неделю перла.
      Ответить
      • $??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see

        удваивается
        Ответить
    • У Дарта Расмуса был отличный учитель
      Ответить
      • Кто такой Дарт Расмус?
        Ответить
        • Видимо, последователь Дарта Мола и Дарта Вейдера.
          Я не согласен - создатель пхп не преследовал злых целей. Тёмная сторона обычно за сокращение энтропии, а не за её экспоненциальный рост.
          Ответить
          • Он просто хотел на чем-то написать свою домашнюю страничку...
            Ответить
        • ну как же

          No Fear
          la-la-la la-la-la
          Destination Darkness
          Ответить
    • В принципе, все понятно - == приводит аргументы к числам (хоть и через жопу), а if($x) хуй его знает как работает, но непустую строку считает true.
      Ответить
      • > == приводит аргументы к числам (хоть и через жопу)
        Ну с этим в перле получше, чем в php. Здесь нет корейского рандома: == всегда кастует в числа, eq всегда в строки. И спутать их очень трудно - баги начинают лезть на первом же сравнении, а не через 5 лет эксплуатации.
        Ответить
        • Я в свое время мозги себе поебал прилично, но с тех пор, как понял, что == всегда кастует в числа, eq всегда в строки, с этим проблем не было. Проблемы с тем, КАК перл конвертирует - '1' == 1, а '0x1' равно... 0
          Ответить
      • > if ($x)

        false if !defined($x)
        if string: is not empty
        if number: is not zero
        if reference: always true
        Ответить
    • ну все верно:
      в первом случае парсим стринг, приводя к числу...
      в втором - делаем из него бул, который истина для любой непустой строки
      Ответить
    • И в продолжение банкета:
      if ("0E0" == 0) {
          print "Zero! ";
      }
      if ("0E0") {
          print "But true...";
      }

      http://ideone.com/2rdGte

      И это реально юзается в DBI: http://search.cpan.org/~timb/DBI-1.631/DBI.pm#execute
      Ответить
      • "0 but true" тоже реально юзается в DBI :)
        Они бы хоть договорились насчет значения.
        Ответить
        • Для чего?
          Ответить
          • DBI::ping возвращает это значение в качестве "а хрен бы знал, скорее всего да", если драйвер не умеет пинговать сервак.

            http://search.cpan.org/~timb/DBI-1.631/DBI.pm#ping
            Ответить
            • И какая разница в данном контексте между "0E0" и "0 but true"?
              Ответить
              • Да в данном контексте хоть строку "а хрен бы его знал" верни, и оно будет и true и 0 одновременно...

                Не знаю, не люблю я пёрл за тысячи мелочей, которые почти каждая функция или оператор в себе таят. Юзаю его только для мелочи, когда текстовички обработать надо или в базу залить. Может быть тем, кто с этим постоянно работает это и привычно.
                Ответить
                • Нет, "а хрен бы его знал" не будет 0.

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

                    > "а хрен бы его знал" не будет 0
                    Будет :(
                    http://ideone.com/UeVR2h
                    Или там еще какие-то тонкости есть?
                    Ответить
                    • Есть: http://ideone.com/sVUQn7

                      Надо понимать, что без use strict; use warnings; Perl сделает всё, чтобы твой код отработал. Но за это надо платить.

                      Если написать в приведённом коде use strictures; то он вообще упадёт, а не просто выдаст предупреждения.
                      Ответить
                      • Понятно.
                        Ответить
                      • Тогда еще вопрос: почему "." в @INC по дефолту стоит в конце?

                        Будет ли BEGIN { unshift(@INC, "."); } адекватным решением, или же лучше просто переименовать модуль, или же стоит увеличить вложенность, переименовав Config.pm в MyProject/Config.pm? Или есть какой-то другой способ справиться с этой траблой?
                        Ответить
                        • Чтобы модули искались и в текущем каталоге. Или вопрос в том, почему именно в конце? Тогда не знаю.

                          Можно предложенные тобой способы использовать. Можно записать use lib '.'; в скрипте или использовать опцию perl -I. script.pl.

                          Мне более правильным кажется создание собственного пространства имён, т. е. MyProject/Config.pm. Но вообще, по обстоятельствам.
                          Ответить
                          • > Или вопрос в том, почему именно в конце?
                            Да, вот это и интересно было.

                            > Можно предложенные тобой способы использовать. Можно записать use lib '.'; в скрипте или использовать опцию perl -I. script.pl.
                            Спасибо ;)

                            > Мне более правильным кажется создание собственного пространства имён, т. е. MyProject/Config.pm
                            Ага, мне тоже кажется, что это самый безопасный вариант. По крайней мере с ним я не потеряю доступ к системным модулям, одноименным с моими.
                            Ответить
                • > Юзаю его только для мелочи, когда текстовички обработать надо или в базу залить.

                  Большая сила -- большая ответственность. Use strict use warnings, Luke.
                  Ответить
    • > The current default implementation always returns true without actually doing anything. Actually, it returns "0 but true" which is true but zero.
      strings /usr/lib/libperl.so.5.14 | grep 'but true'
      0 but true
      RWXrwx0 but true
      Ибо нефиг.
      Ответить
    • А в руби 0 = это ложь. В руби все ложь кроме nil и false
      Ответить
      • В Lua тоже всё истина, кроме nil и false.
        Ответить
        • и это здорово
          Ответить
          • Да ничего хорошего. Подходит только для жабофагов и прочих поклонников сверхстрогой типизации.
            Я ещё понимаю, когда кто-то недоволен, когда "1.0" равно "1.00000000000000001" или когда "[1,2,3]" равно Array(1,2,3) -- тут два операнда и происходящее часто не соответствует здравому смыслу.
            Но приведение к bool - это не баг, а фича, которая способствует краткой и понятной записи.
            Пока жабофаги пишут if (counter == 0 || remained != 0 && next != null && isClosed == false), сишкоцари любуются на простое и понятное if (!counter || remained && next && !isClosed) и ликуют.
            Ответить
            • Пока тупые жабофаги пишут if (counter == 0 || remained != 0 && next != null && isClosed == false),
              сишкоцари (собирающие без ворнингов) и прочие яваскриптеры ищут где у них одно равно вместо джвух.

              >>isClosed == false
              Бульщит можно где-угодно написать.
              Ответить
              • > ищут где у них одно равно вместо джвух
                Потому в жс сделали три равно, чтобы при ошибке было тоже сравнение.
                И конечно же, написав "!counter" можно спасти себя от "counter = 0".

                > Бульщит
                a == ежедневное_специфическое_значение ничем не лучше
                Ответить
      • > В руби все ложь кроме nil и false
        O_o. А nil и false это истина? Хуяссе принцип наименьшего удивления.
        Ответить
        • эээ... сорри, ошибка первого рода - подумал правильно - написал неправильно.

          А в руби 0 = это true . В руби все true кроме nil и false

          наверное нужно спать больше 4 часов)
          Ответить
        • Оффтоп - кто нибудь в Asp.net mvc +ajax шарит? я бы не спрашивал, но уже 3 день не могу ничего найти по своей проблеме, может есть добрые люди...
          Ответить
          • Сам разобрался, теперь можете меня спрашивать, я обрел просветление
            Ответить
      • Руби - это ложь.
        Ответить
      • дак как бы в перде как бы тоже так должно быть, но это special case
        Ответить

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