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

    −113.6

    1. 1
    2. 2
    3. 3
    4. 4
    sub append {
        my $appendstring = @_[0];
        $returnstring = "$returnstring$appendstring";
    }

    Из плагина к nagios'у, который проверяет состояние интерфейсов на cisco-девайсах. http://svn.opsview.org/opsview/trunk/opsview-core/nagios-plugins/check_snmp_cisco_ifstatus .

    Запостил: aag, 20 Января 2010

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

    • TIMTOWTDI в действии :)
      Ответить
    • Поясните плиз. Есть глобальная строчка $returnstring, при вызове данной функции к ней аккумулируется $appendstring и возвращается конечный результат. В чем ГК ?
      Ответить
    • Видимо в том, что интерполяции переменных $returnstring и $appendstring внутри строки не произойдёт, и конкатенации строк соответсвенно тоже. Наверное подразумевалось следующее:
      $returnstring = $returnstring.$appendstring;

      Хотя может тут какая-то особенная запутанная логика. Без примера вызова функции append и использования результата этого вызова сказать трудно.
      Ответить
      • хотя вру, произойдёт интерполяция. ТОгда с чистой совестью можно было написать return $returnstring.=@_[0];
        Ответить
    • С чистой совестью можно и так:

      sub append
      {
      $returnstring . shift;
      }

      В общем а). не гк b). как уже сказано TIMTOWTDI
      Ответить
    • приведён только небольшой фрагмент кода, если более подробно показать то там так
      $returnstring = "";
      [skipped]
      $temp = sprintf "$ifdescr ($iftype_string) - Current: $ifoutbitssec, Limit: $ifspeed, MTU: $ifmtu и т.д.";
      append($temp);
      [skipped]
      sub append {
      my $appendstring = @_[0];
      $returnstring = "$returnstring$appendstring";
      }


      непонятно зачем было делать специальную функцию, которая добавляет к заведомо известной глобальной переменной строку из параметра этой функции, когда всё вышеописанное можно сделать одной строчкой в месте где вызывается эта функция

      $returnstring = "";
      [skipped]
      $returnstring .= "$ifdescr ($iftype_string) - Current: и т.д.";

      а так в принципе про любой гк на перле можно сказать - это тоже TIMTOWTDI
      Ответить
    • Хм.. А @_[0] вообще не должно синтаксическую проверку даже пройти по идее
      Ответить
      • почему это?
        @_ это список параметров, переданных подпрограмме
        Ответить
        • Спасибо, я знаю, что это список параметров.
          Если есть любой массив @a, то обращение к его элементу по индексу происходит: $a[0]
          Так и здесь будет $_[0] - потому что это скаляр в итоге.
          Ответить
          • Хотя без use strict пройдёт, но это плохой тон не ставить его
            Ответить
            • да это для жизни опасно, не то что тон плохой))
              Ответить
              • Для жизни - не для жизни.. Но чаще всего, потенциальное место программе без этого на этом ресурсе.. Ну это, конечно, не самое страшное, проблем может возникнуть.. Хотя я об этом читал только в книжках и только примерно себе представляю - меня сразу научили, что надо писать, потому то и потому то
                Ответить
          • Синтаксически тут всё правильно:
            $_[0] - это скаляр, 0-й элемент массива @_
            @_[0] - это список, срез массива @_
            Ответить
    • вониshд
      Ответить

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