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

    −155

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    #!/usr/bin/perl
    
    use strict;
    use warnings;
    use Data::Dumper;
    
    sub mymap(&@) {
        my ($code, @result) = shift;
    
        push @result, $code->() for (@_);
    
        return @result;
    }
    
    sub doit_map {
        return {
            some_key => [
                map { return $_; } qw(one)
            ]
        };
    }
    
    sub doit_mymap {
        return {
            some_key => [
                mymap { return $_; } qw(one)
            ]
        };
    }
    
    print Dumper({
        doit_mymap => doit_mymap,
        doit_map => doit_map,
    });

    Реализация mymap, конечно, заслуживает отдельного треда. But leave it... for time being.

    Вся соль в различии возвращаемых значений. В доке конечно описано почему оно так: http://perldoc.perl.org/functions/map.html. Но негативный осадок всё-же остался.

    http://ideone.com/q1HFDW

    Запостил: Elvenfighter, 19 Ноября 2013

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

    • Говнокод в 1й строке
      Ответить
    • > В доке конечно описано почему оно так

      Пальцем ткнешь? Лень все перечитывать.

      Первый раз вижу что кто-то `return` внутри `{}` блока делает. Если убрать ретурн то вроде как бы работает как и ожидается.
      Ответить
      • Вы почти дали ответ на ваш вопрос. map -- выполняет код именно как *блок кода* в контексте вызывающей функции.Типа такого:
        sub some_sub {
           MAP: {
                return 1;
           }
        }


        В то время как обычные функции получают CODEREF. Он же:
        my $code = sub { print "something"; };
        $code->();


        Конкретно в доке по map есть хинт: map BLOCK LIST
        А в perlsyn описано что такое BLOCK: http://perldoc.perl.org/perlsyn.html#Basic-BLOCKs
        Ответить
        • а... т.е. говно тут в том что map() это syntax sugar. это одна из причин почему я никогда с ним не эксперементировал, и пользуюсь им только в типичных синтаксах.
          Ответить
        • Имхо в таких случаях лучше пользоваться обычными циклами, а не map. Рабочий вариант-аналог с map:
          sub doit_map {
              return {
                  some_key => [
                      map { my $c = sub { return $_ }; $c->() } qw(one)
                  ]
              };
          }
          Ответить
          • И да, более грамотный вариант:

            sub map_function {
                return $_;
            }
            
            sub doit_map {
                return {
                    some_key => [
                        map { &map_function } qw(one)
                    ]
                };
            }
            Ответить

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