=()= / Говнокод #3726 Ссылка на оригинал

0

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

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

Запостил: Мистер Хэнки Мистер Хэнки, (Updated )

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

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

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

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

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

      Говнокод однозначно.
      Надо было делать 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~"

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

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

Помни, guest, за тобой могут следить!

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


    8