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

    −121

    1. 1
    @items = keys %{{ map { $_ => 1} @items }};

    Удаление повторов из массива.
    Вроде и не ГК, но, блин, такие вырвиглазные конструкции меня порой убивают... Мои глаза...

    Запостил: Мистер Хэнки, 17 Июля 2010

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

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

        %temph = map { $_ => 1 } @items;
        @items = keys %temph;
        Ответить
        • не вижу улучшений в читаемости, уж извините
          Ответить
          • ну если ты не знаешь перла, то у тебя есть два варианта: либо не пытаться читать, либо выучить хотя бы базовый синтакс.

            http://www.perl.com/pub/a/2000/10/begperl1.html
            Ответить
            • я то знаю, но перл по сути своей из языков, который лучше пишется, чем читается
              Ответить
              • это относится ко всем языкам.

                читать код на порядок сложнее чем писать. когда пишешь, знаешь что/зачем делаеться. когда читаешь, нужно буквально в голове постоянно гадать что думал программист когда писал это.

                если бы код было легко читать, тогда все бы делали рутинно код ревью. и качество софта в среднем было бы на порядок выше того что мы имеем сейчас.
                Ответить
                • вообще то это один из основных показателей говнокода. то что его читать сложнее чем писать...
                  написанное однажды - не читается никогда
                  Ответить
                  • Не хотите ли сказать, что всё, опубликованное на http://ioccc.org/ , — ГК?
                    Например, вот такое: http://www.de.ioccc.org/2000/bmeyer.c
                    Ответить
                    • >один из
                      Второй - это бытность частью production системы
                      Ответить
                      • Точно! Врач никогда не поставит диагноз по единственному симптому, например, по температуре.
                        Ответить
    • Перевод в хэш -- наиболее простой способ удалить дубликаты в перле
      Ответить
      • и вообщем то аналогично тому как это делается в других языках.
        Ответить
      • ну вообще тут и так через хэш сделано, просто в одну строку
        Ответить
      • Это можно сделать по-разному!

        Говнокод однозначно.
        Надо было делать splice внутри кода map а то убивается порядок элементов массива
        Ответить
    • Только зачем две пары фигурных скобок вокруг мап, не пойму
      Ответить
      • Я так понимаю что первая пара используется для преобразования хэша в ссылку, а вторая - обратно.
        Ответить
        • Для того чтоб обратно вторая пара фигурных скобок не нужна, % и разыменовывает ссылку
          Ответить
          • В данном случае нет. Можете проверить.
            Первая пара создает из хэша ссылку. Если перед ними добавить еще и % perl решит, что возвращаемое значение уже является ссылкой и вы просто пытаетесь его разыменовать. Вообще "%{ }" - оператор разыменования. Просто % сработает только для явного указания скаляра - %$hash_ref.
            Ответить
        • Только не хеша в ссылку, а массива - в ссылку на хеш.
          Ответить
    • Есть куда более интересные варианты:
      my $port = join ',',
            map { $config{'scanner'}{$_}{'port'} }
            grep { $config{'scanner'}{$_}{'port'} and !$config{'scanner'}{$_}{'disabled'} and !$config{'scanner'}{$_}{'no_nmap'} }
            keys %{ $config{'scanner'} };
      ...
      my $protos = join( ' OR ',
          map { " $tq$static{'db'}->{'table_prefix'}$config{'sql_tresource'}$tq.${rq}prot$rq = $vq$_$vq" }
          grep { $config{'scanner'}{$_}{'scanable'} and !$config{'scanner'}{$_}{'disabled'} } keys %{ $config{'scanner'} } )
          or return $config{'nothing_scan_sleep'};
      Ответить
    • Это почти энциклопедический пример выделения уникальных элементов массива. Не говнокод.
      Хотя для улучшения читабельности можно использовать функцию uniq из модуля List::MoreUtils или что-то подобное.
      Ответить
      • Почти энциклопедический -- это так:
        perl -le "my @items = (3, 5, 1, 4, 2, 3, 4, 1); my %h; @items = grep { !$h{$_}++ } @items; print qq~@items~"

        В таком случае порядок элементов сохраняется.
        Ответить
    • забавно
      Ответить
      • Позабавился с твоим тугеньким, розовеньким, уснащённым частицами засохшего кала анусиком.
        Ответить

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