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

    −167

    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
    use strict;
    use warnings;
     
    my $bottom = sub {
        my $test = shift // 'undef';
        print "bottom( $test )\n";
    };
     
    sub sub_bottom {
        my $test = shift // 'undef';
        print "sub_bottom( $test )\n";
    }
     
    sub fallthrough {
        &$bottom;
    }
     
    sub not_fallthrough {
        &$bottom();
    }
     
    sub not_fallthrough2 {
        sub_bottom;
    }
     
    fallthrough('Fallen1');
    not_fallthrough('Fallen2');
    not_fallthrough2('Fallen3');

    Долго пытался понять как до сабины доходят аргументы, хоть она вызывается без них. Обнаружил вот это. OH SHI~
    Вывод:

    bottom( Fallen1 )
    bottom( undef )
    sub_bottom( undef )

    http://ideone.com/QXT3HJ

    Запостил: Elvenfighter, 23 Августа 2013

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

    • показать все, что скрытоhttp://ideone.com/0OGYmn

      Чёрт :(
      Ответить
    • Я правильно понял, что если функция вызывается по ссылке и мы не указываем после нее скобки, то на вход ей передается текущий массив @args ?
      Даже не знал о таком нюансе в perl, в документации есть что-нибудь по данному поводу ?
      Ответить
      • Вернее не @args, a @_
        Ответить
      • &foo(1,2,3);	# pass three arguments
            foo(1,2,3);		# the same
        
            foo();		# pass a null list
            &foo();		# the same
        
            &foo;		# foo() get current args, like foo(@_) !!
            foo;		# like foo() IFF sub foo predeclared, else "foo"

        http://perldoc.perl.org/perlsub.html
        Ответить
        • Я всегда знал, что перл это пиздец, который полностью знает и понимает только его автор. Но не настолько же...

          Почему оно так себя ведет только при вызове через ссылку, а прямой вызов будет без аргументов? :)
          Ответить
          • Для ссылки производится разыменовывание, как указано в последнем случае в примере. Т.е. &$bottom превращается в рантайме в &bottom. Вариант с foo; (у вас sub_bottom) обрабатывается на этапе компиляции.
            Вообще, правильно использовать goto &sub_name; goto &$sub_name; чтобы не заморачивать голову ни себе, ни другим.
            Ответить
            • > goto &sub_name
              The new subroutine inherits the argument stack and other features of the original subroutine; it becomes impossible for the new subroutine even to know that it was called by another name.

              Жжесть... Буду и дальше юзать перл как очень удобный движок для переработки текстовых файлов. Для чего-то более масштабного - нет уж, увольте ;)
              Ответить
              • >Жжесть...
                Ты часто дебажишь? И именно в данном куске кода? Или пишешь код как выше? Не такая уж страшная проблема. Зато не прибавляет тормозов, понятна всем и работает как задумано. Твой вариант через $mysub тоже не отдебажишь нормально, ибо это анонимная функция.

                >Для чего-то более масштабного - нет уж, увольте ;)
                Дело твое. Везде есть свои плюсы/минусы.
                Ответить
                • > Твой вариант
                  Это не мой код ;) Для меня оба кода темный лес. Что с goto, что со ссылкой.

                  Все что я пишу на перле - это конвертеры/аггрегаторы/анализ логов и т.п. Ну иногда простые скриптики для пакетной обработки чего-нибудь, если на баше это будет сильно страшно (регулярки, выпарсивание чего-то из файлов, вычисления и т.п.). Для этих целей он мне очень нравится.

                  > Ты часто дебажишь?
                  Нет, тупо прогоняю скрипты на контрольных примерах. Я перловский дебаггер никогда не юзал, даже не знал, что он есть.
                  Ответить
        • показать все, что скрытоvanished
          Ответить
    • > my $bottom

      Тогда уж сразу my $ass.
      Ответить
    • Функции вызываются $var->(...), всё остальное deprecated.
      Ответить
    • показать все, что скрыто<a href=http://cialis10mgprixenpharmacieenligne.com/>cialis 10mg prix en pharmacie en ligne </a>
      <a href=" http://cialis10mgprixenpharmacieenligne.com/ ">cialis 10mg prix en pharmacie en ligne </a>
      Ответить
    • показать все, что скрыто<a href=http://cialis20mgprixenpharmacierx.com/>cialis 20mg le prix </a>
      <a href=" http://cialis20mgprixenpharmacierx.com/ ">cialis 20mg prix en pharmacie en france </a>
      Ответить
    • показать все, что скрыто<a href=http://cialissansordonnanceenfrance.com/>cialis sans ordonnance paris </a>
      <a href=" http://cialissansordonnanceenfrance.com/ ">cialis sans ordonnance pharmacie paris </a>
      Ответить
    • показать все, что скрыто<a href=http://achetercialissansordonnanceenpharmacie.c om/>acheter cialis sans ordonnance en pharmacie </a>
      <a href=" http://achetercialissansordonnanceenpharmacie.c om/ ">acheter cialis belgique sans ordonnance </a>
      Ответить
    • показать все, что скрыто<a href=http://achatcialisenfrancelivraisonrapide.com>a chat cialis generique en france </a>
      <a href=" http://achatcialisenfrancelivraisonrapide.com ">achat cialis en france livraison rapide </a>
      Ответить
    • показать все, что скрыто<a href=http://achatcialis5mgenligne.com/>acheter cialis 5mg en ligne en france </a>
      <a href=" http://achatcialis5mgenligne.com/ ">acheter cialis 5mg </a>
      Ответить
    • показать все, что скрыто<a href=http://achetercialis20mgenligne.com/>cialis 20mg vente en ligne </a>
      <a href=" http://achetercialis20mgenligne.com/ ">acheter cialis 20mg en ligne </a>
      Ответить
    • показать все, что скрыто<a href=http://achattadalafilenfranceenpharmacie.com/>acheter cialis en france </a>
      <a href=" http://achattadalafilenfranceenpharmacie.com/ ">achat cialis en ligne france </a>
      Ответить
    • показать все, что скрыто<a href=http://acheterprednisone20mgenligne.com/>acheter prednisone 20 mg </a>
      <a href=" http://acheterprednisone20mgenligne.com/ ">acheter prednisone </a>
      Ответить
    • показать все, что скрыто<a href=http://acheterpropeciasurinternet.com/>acheter propecia sur internet </a>
      <a href=" http://acheterpropeciasurinternet.com/ ">acheter propecia sur internet </a>
      Ответить

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