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

    −153

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    sub asd {
    	
    	print "WUT\n";
    	
    	return { 1 => 2 };
    }
    
    while( my ( $k, $v ) = each( %{ asd() } ) ) {
    	
    }

    http://ideone.com/EvoMvV

    Запостил: kainwinterheart, 23 Июня 2014

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

    • Каждый раз создается новый HASHREF, а each сохраняет итератор для каждого хеша. Вполне очевидное поведение.

      Из той же оперы:
      while (my ($k, $v) = each %hash) {
          print "$k => $v\n";
          keys %hash;
      }

      http://ideone.com/PzjydH
      Ответить
      • Что keys() сбрасывает внутренний итератор - известно и документировано. А вот очевидным поведением в данном случае было бы один раз посчитать значение asd(), и уже потом работать именно с посчитанным значением, вместо того, чтобы по неведомой причине пересчитывать его каждый раз.
        Ответить
        • http://perldoc.perl.org/functions/each.html

          Походу тут именно each EXPR
          Ответить
          • Starting with Perl 5.14, each can take a scalar EXPR, which must hold reference to an unblessed hash or array. The argument will be dereferenced automatically. This aspect of each is considered highly experimental. The exact behaviour may change in a future version of Perl.
            Ответить
            • > unblessed
              Что это вы там такое с массивами делаете?
              Ответить
              • У благославленного массива можно вызывать методы :) В общем он становится объектом.
                Ответить
              • отречение массива от церкви)
                Ответить
          • >>perldoc

            пердак
            Ответить
            • > пердак
              perlduck
              Ответить
              • perlduck Tales, Oo-oo
                Tales of derring-do, bad and good luck tales, oo-oo
                Not pony tails or cotton tails but perlduck Tales, oo-oo!
                Ответить
              • > perlduck
                По такому запросу гугль меня отправил на какой-то индусский сайт поиска работы. Задумался...
                Ответить
              • Per duck.
                Гугол уверяет, что это "за утки".
                Ответить
                • и это верно
                  типа
                  miles per hour
                  Ответить
                  • Да, я об этом и подумал. Только более корректно использование"в": "километры в час", "оборотов в минуту". Но, с другой стороны, "точек на дюйм".
                    Ответить

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