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

    −124

    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
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    # Relocate
    if (open(my $reloc, "support/reloc.txt")) {
        # ...
        print "Relocating...";
        my $count = 0;
        local $_;
        while (<$reloc>) {
    	chomp;
    	my($type, $f) = split(' ', $_, 2);
    	$f = "$prefix/$f";
    	$f =~ s,/,\\,g;
    	#print "Relocating $f...\n";
    	my $read_only;
    	unless (-w $f) {
    	    $read_only++;
    	    run("\@attrib", "-r", $f);
    	}
    
    	open(my $fh, "+<", $f) || die "Can't open $f: $!";
    	binmode($fh);
    	my $content = do { local $/; <$fh> };
    
    	if ($type eq "B") {
    	    $content =~ s,\Q$sponge\E([^\0]*),$prefix$1$binary_pad,go;
    	}
    	else {
    	    $content =~ s,\Q$sponge\E,$prefix,go;
    	    $content =~ s,\Q$sponge_str\E,$prefix_str,go if $^O eq "MSWin32";
    	    truncate($fh, length($content)) || die "Can't truncate '$f': $!";
    	}
    
    	seek($fh, 0, 0) || die "Can't reset file pos on '$f': $!";
    	print $fh $content;
    	close($fh) || die "Can't write back content to '$f': $!";
    
    	run("\@attrib", "+r", $f) if $read_only;
    
    	$count++;
        }
        print "done ($count files relocated)\n";
    }

    установщик перл...
    reloc.txt содержит 137 файлов.

    Запостил: seonull, 01 Ноября 2010

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

    • а в самих файлах:
      #line 15
      eval 'exec C:\TEMP\perl---please-run-the-install-script---\bin\perl.exe -S $0 ${1+"$@"}'
      Ответить
      • это говно не в перле и не в скрипте - а в самих виндах, бо консольных приложений по челевечески не поддерживают.

        а так вообще нормальный скрипт. даже не вижу к чему придратся. безопастный 3-param open() - используется. ошибки обрабатываются. совместимость с Win32 сделана. и даже диагностические сообщения выводятся.
        Ответить
        • да причем тут безопасность. зачем захардкоживать полный путь, а потом еще и править исходники регекспом. зачем он там вообще нужен?
          Ответить
          • не вижу в скрипте ни одного абсолютного хард-кодед пути. тот "support/reloc.txt" просто говорит что скрипт должен запускаться только из определенного каталога/окружения (так как он может при неправильном использовании случайные файлы повредить). с одной стороны.

            с другой стороны. в случае простых скриптов намного проще и полезнее задавать параметры прямо в самом скрипте, например в самом начале скрипта. бо даже и обычному пользователю задавать два десятка параметров на коммандной строке не очень удобно - и часто просто убивает все преимущества автоматизации предоставляемой скриптом. (тем более на виндах где история и редактирование коммандной строки настолько примитивны. я как то раз пробовал dcraw'ом с коммандной строки в виндах пользоватся... )
            Ответить
            • я не про "support/reloc.txt", я про магическую строчку 15 "eval 'exec C:\TEMP\perl---please-run-the-install-script---\bin\perl.exe -S $0 ${1+"$@"}'" в каждом из 137 файлов. вы все еще не понимаете в чем здесь говно?
              Ответить
              • а это... так это дефолтный шаблон. это в примерах скриптов стоит - и патчится автоматом на стадии инсталяции.

                юзер похоже в корпоративной сети/домене сидит и не может с его правами инсталяцию до конца довести (у меня в офисе та же песня). перл будет работать - но вот такие кучки ГК остаются неубраными.
                Ответить
                • а зачем, зачем эта строчка там стоит?
                  Ответить
                  • с одной стороны что бы инсталятор знал что патчить. с другой стороны что бы программер видел что инсталятору не дали доделать его работу и могут быть потенциальные грабли при дальнейшей работе с перлом.

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

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