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

    −119

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    use strict;
    use warnings;
     
    my ($i, $j) = (42, 13);
     
    my $max = [ $i => $j ]->[ $i <= $j ];
     
    print "max: $max\n";

    Вот-так вот: http://ideone.com/2Rd3Mr

    // Вроди где-то в PBP этот пример даже есть

    Запостил: Elvenfighter, 31 Июля 2013

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

    • красиво. плюсанул.

      ЗЫ для непосвященных, в строке №6, создается ссылка на массив из двух элементов (`[$i=>$j]`, аналогично `[$i,$j]`), ссылка разыменовывается (`->`), и из массива берется элемент с индексом `$i <= $j` (булево выражение как индекс).
      Ответить
      • >ссылка
        >разыменовывается
        >язык со сборкой мусора без указателей
        Но зачем?
        Ответить
        • "Но зачем?"

          Попробую ответить на этот реторический вопрос: Чтоб жизнь малиной не казалась!
          Ответить
      • А min тогда будет вычисляться как [ $i => $j ]->[ $i >= $j ]?
        Ответить
        • да.

          но это просто кто-то состебался. в перле, в List::Utils, уже есть min/max.
          Ответить
      • Менее красивая, но чуть более понятная форма c обычным массивом:
        my $max = ($i, $j)[$i <= $j];
        Ответить
        • нет, это синтаксом перла не поддерживается.
          нужно что-то типа:
          @{[$i, $j]}[$i >= $j];

          или через временный массив.

          что все равно гк по сравнению с `max($i,$j)`.
          Ответить
          • От чего же не поддерживается? Поддерживается всё: http://ideone.com/Q4A9Mh
            Ответить
            • а. вижу. на старых перлах (5.003) это точно не работало, а на новом я вчера типичную перловую ошибку сделал - `warn ($i, $j)[$i <= $j];` вместо `warn (($i, $j)[$i <= $j]);`
              Ответить
              • Вспоминается бородатая шутка:

                А что, на этом вашем Perl даже helloworld нельзя написать без use strict; use warnings; ?
                Ответить
      • А почему ($i=>$j) - это массив из 2 элементов, а не ассоциативный массив из одной пары (i,j)? А, ну да, наверняка в перле это одно и то же, а о более вменяемых ограничениях типизации там не слышали.
        Ответить
        • >А почему ($i=>$j) - это массив
          А потому, что хеш-массивы в перле через {}
          Ответить
        • это фича, основное использование которой заключается в передаче хэша как аргумента функции:
          my %h = (a => 1, b => 2);
          my @a = %h;  # qw/a 1 b 2/;
          my %h2 = @a; # %h ~~ %h2
          
          sub example {
            my %params = @_;
            return $params{a} + $params{b};
          }
          example( %h );
          example( @a );  # same
          example( a => 1, b => 2 ); #same


          > а не ассоциативный массив из одной пары (i,j)?

          наверное потому что практической пользы мало.
          практический пример непрактичности: С++ный std::map и его любовь к std::pair.
          Ответить
    • my ($i, $j) = (42, 13); # теперь $i = 42, а #j = 13;
      my $max = [ $i => $j ]->[ $i <= $j ];
      # 1. Создается ссылка на массив из двух скаляров: 42 и 43 ("=>" это синоним запятой)ъ
      # 2. Ссылка разыменовывается (->) и получается первый элемент, так как "42 <= 13" это  false, сиречь 0
      # 3. Первый элемент тут 42, он правда max.
      # чудеса

      я теперь перлоёб
      Ответить

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