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

    −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
    sub write_cookie {
    	my %params = @_;
    
    	if ($params{'-expires'} =~ /\+(\d+)m/) {
    		my ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime($date + $1 * 60);
    
    		$year += 1900;
    		my @mos = ("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
    		my @dys = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
    		$mon  = $mos[$mon];
    		$wday = $dys[$wday];
    
    		$params{'-expires'} = sprintf("%s, %02i-%s-%04i %02i:%02i:%02i GMT", $wday, $mday, $mon, $year, $hour, $min, $sec);
    	}
    
    	$params{'-path'}    = " path=$params{'-path'};"       if $params{'-path'};
    	$params{'-expires'} = " expires=$params{'-expires'};" if $params{'-expires'};
    
    	"$params{'-name'}=$params{'-value'};$params{'-path'}$params{'-expires'}";
    }

    setcookie() Perl-вариант.

    Запостил: Arigato, 11 Ноября 2010

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

    • Юзать модуль CGI для кук — вот перл вариант!
      Ответить
      • Впрочем, если это делать вручную, то не вижу здесь говна (массивы, спринтф)
        Ответить
        • форматирование стандартной даты через массивы месяцев и дней - тоже кошерно?
          Ответить
          • возьмём замечательную функцию POSIX::strtfime
            %b - это трёхбуквенное слово, обозначающее месяц.

            print strftime('%b', gmtime)
            у меня на винде вернулось... слово "ноя"
            ===
            Значит нормально.
            Ответить
            • POSIX::strftime - это вызов функции ОС, перл не причём.

              Хотя, может есть в перле функция, возвращая английский вариант всегда. Надо поискать.
              Ответить
          • да - если нужно портабельно дату по RFC822/RFC2822 генерить. что и делает выше приведеный код.
            Ответить
        • Говно в формировании даты. Или я ошибаюсь?
          Ответить
          • Сам код не говно.

            Но если в перле нет встроенной функции (или хотя бы в одном из поставляемых модулей), возвращающей названия месяцев и дней только в английском варианте, а не в локали, то это плохо
            Ответить
            • > Но если в перле нет встроенной функции (или хотя бы в одном из поставляемых модулей), возвращающей названия месяцев и дней только в английском варианте, а не в локали, то это плохо

              А, ну тогда понятно, почему такие костыли.
              Ответить
            • > Но если в перле нет встроенной функции (или хотя бы в одном из поставляемых модулей), возвращающей названия месяцев и дней только в английском варианте, а не в локали, то это плохо

              есть внешние модуля. но по определению: системная функция stftime() всегда работает в текущей локали. в Перле можно поставить локаль в "С" - но это не со всеми системами совместимо и так же имеет негативный эффект на производительность.

              но с другой стороны. дата должна быть не просто по англиски написана (и англиских локалей между прочим много) и не по ISO стандартам - а по RFC822/RFC2822. так что системные функции (== POSIX == ISO) по определению не катят.
              Ответить
    • Уважаемый striker, который раз голосую за код, а оценка не меняется.
      Вижу что она поменялась, только после перезагрузки страницы.
      Браузер Firefox 3.6.12. И в хроме тоже.
      Ответить
      • Пользуюсь хромом, все норм.
        По теме:
        Функция - велосипед, но на гавнокоде ей точно не место.
        Ответить
      • бывает, там же целых два запроса, чото залипло
        хуже когда коммент не постится
        Ответить
    • все перловики после 2000го года знают про модуль CGI)
      либо это его сырцы либо тут не обошлось без пхпшника)

      зы:
      >>$params{'-expires'}
      точно не сырцы
      и точно не без пхпшника)
      Ответить
      • > все перловики после 2000го года знают про модуль CGI)

        Видимо, после 2010 они начали про него забывать :)
        Ответить

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