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

    −210.4

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    sub trim_string
    {
        my($sref) = $_[0];
    
        $$sref =~ s/^\s+//g;
        $$sref =~ s/\s+$//g;
    }

    Написано владельцем одной известной говнокомпании, который утверждает, что программировать может каждый.

    Запостил: guest, 15 Мая 2009

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

    • Уважаемый, а в чем говнокод заключается, если не секрет ?
      Ответить
    • Не представлюсь:
      1). В избыточности лексической переменной $sref и модификатора "g". Все то же самое можно было написать так:

      sub trim_string {
      $$_[0] =~ s/^\s+//;
      $$_[0] =~ s/\s+$//;
      }

      Или так:

      sub trim_string {$$_[0] =~ s/^\s+|\s+$//g}

      2). Ну, а если бы говноатор знал о Perl чуть больше, чем ему подсказывала интуиция, то передавать скалярную переменную по ссылке в функцию trim_string() не стал бы вообще, ограничившись модификацией первого элемента @ARG.
      Ответить
      • Ну вообще использовать вместо $_[0] именованную переменную - является скорее хорошим тоном в программировании, чем ошибкой
        Ответить
      • Два регекспа в данном случае отработают быстрее, чем один с "|".
        Ответить
    • саминезнаетекто:
      Дайте я угадаю - вы одинокий псих-неудачник, склонный к истерикам или к занудству.
      Ответить
    • klem4:
      [quote]1). В избыточности лексической переменной $sref и модификатора "g". Все то же самое можно было написать так:[/quote]

      И что ваша первая функция выдаст на строке
      my $s = "  я  \n  строк  \n  ка  \n  ";

      без модификатора g ? Выдаст она неверный результат.

      Безусловно бело зависит от контекста. ИМХО не говнокод это.
      Ответить
    • Не представлюсь:
      [quote=klem4]И что ваша первая функция выдаст на строке

      1.my $s = " я \n строк \n ка \n ";[/quote]

      Чтобы результат совпал с ожиданиями надо поставить фигурные скобки вокруг $_[0], вот так: ${$_[0]} Это я не доглядел. А модификатор "g" здесь не нужен.
      Ответить
    • >>Это я не доглядел.
      Вы даже не неудачник - Вы быдлокодер, который не проверяет свой код!
      Ответить
    • [quote=klem4]без модификатора g ? Выдаст она неверный результат[/quote]
      она и с g не даст результата, надо еще m
      Ответить
    • Черт, хотел обругать постера этого кода, а тут уже за меня все сделали.
      Ответить
    • Я бы счел это говнокодом только за то, что он модифицирует значение by reference. Очень нечитабельно. Что плохого просто в:

      sub trim_string { my ($ref) = shift; return $ref =~ s/^\s+|\s+$/; }
      Ответить
      • Это плохо если передается большой кусок текста, а так ничем впринципе
        Ответить
      • Модификатор g здесь нужен.
        Просто s/^\s+|\s+$/; удалит только пробелы в начале строки, в конце не удалит.
        Просто встретит первое попавшееся и удалит и закончит на этом работу.
        Ответить
      • sub trim_string
        {
        my $ref = shift;
        s/^\s+//, s/\s+$// for $ref;
        return $ref;
        }

        1. Забрать параметр явно
        2. В перле так можно делать и читается неплохо вроде
        3. Явно отдать параметр

        P.S. Читабельно в одну строчку написать не получиться. Так что 1 и 3 нужны по любому.
        Ответить

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