Forum Webscript.Ru

Программирование => Perl => Тема начата: metton от 23 Августа 2003, 03:43:20

Название: Странность с хедером и ещё...
Отправлено: metton от 23 Августа 2003, 03:43:20
странность с хедером...
Почему такой код не выдаёт ошибки 500?!

#!/usr/bin/perl -w

use strict;

print qq{
Content-Type: text/html};

Он просто выводит Content-Type: text/html
Кто же посылает хедер?

А вот если оператор print переписать так:
print qq{Content-Type: text/html};
то выводится долгожданное (:)) сообщение об ошибке...


...и ещё...
Что возвращает cookie() (модуля CGI) если ей передать значение substr($str,0,-1) при том что $str - не опеределено (undef).
Вот пример.
print substr(undef,0,-1);
print cookie(substr(undef,0,-1));
Почему если использовать только первую строку - выдаётся только предупреждение, а если вторую - ошибка Modification of a read-only value attempted at e:\\my_soft\\perl\\cgi\\cgi-bin\\LIST18~3.CGI line 52.

ЗЫ: никакой практической ценности этот пример не несёт - просто получилось так, что то, что передавалось substr было undef и я долго не мог понять то, что я и спрашиваю...
Название: Странность с хедером и ещё...
Отправлено: metton от 25 Августа 2003, 21:50:10
Ответьте кто-нибудь, плз.
Название: Странность с хедером и ещё...
Отправлено: arto от 25 Августа 2003, 23:59:50
print "Content-Type: text/plain\\n\\n";
print "test"
Название: Странность с хедером и ещё...
Отправлено: metton от 26 Августа 2003, 00:14:33
2arto
И что??!
Ты вопрос внимательно читал?
Название: Странность с хедером и ещё...
Отправлено: Wyclef от 26 Августа 2003, 10:04:24
Цитировать
metton:
Почему такой код не выдаёт ошибки 500?!


Если посудить логически, то получается, что в первом случае реальный content-type как бы задан и равен undef, поле его вывода, как надо идет пусктая строка. И вывод далее Content-Type:... считается обычной строкой... А во втором выводе нет пустой строки после явно заданного заголовка.

Цитировать
Что возвращает cookie()


Наверно правильнее было бы написать:
print substr(cookie(\'cookname\'),0,-1); #cookie(\'cookname\') = undef
Название: Странность с хедером и ещё...
Отправлено: metton от 26 Августа 2003, 17:53:22
2Wyclef
Да. Со 2-ым вариантом стормозил. НО КТО ВЫВОДИТ ХЕДЕР В ПЕРВОМ??!!

Насчёт куков - именно так как я сказал. Просто было нужно обрезать строку и передать её как имя cookie()-у.
Вопрос чисто теоретический... Просто интересно.
Название: Странность с хедером и ещё...
Отправлено: NeoNox от 26 Августа 2003, 18:17:30
perl за тебя. он иногда исправляет неряшливых программистов.
только нельзя на это пологаться.
или есть какие еще мнения?
Название: Странность с хедером и ещё...
Отправлено: mike от 26 Августа 2003, 19:58:26
Цитировать
NeoNox:
или есть какие еще мнения?

Аналогично - веб-сервер, но полагаться на это по-прежнему нельзя.
Название: Странность с хедером и ещё...
Отправлено: Wyclef от 26 Августа 2003, 20:03:05
metton:
Так как у тебя написано - будет ошибка, а если имя куки в переменной - будет аналогичный варнинг...
Цитировать
[b]perldoc perltrap[/b]:
(Constants)
perl 4 lets you modify constants:

    $foo = "x";
    &mod($foo);
    for ($x = 0; $x < 3; $x++) {
        &mod("a");
    }
    sub mod {
        print "before: $_[0]";
        $_[0] = "m";
        print "  after: $_[0]\\n";
    }

    # [b]perl4[/b]:
    # before: x  after: m
    # before: a  after: m
    # before: m  after: m
    # before: m  after: m

    # [b]Perl5[/b]:
    # before: x  after: m
    # Modification of a read-only value attempted at foo.pl line 12.
    # before: a
Название: Странность с хедером и ещё...
Отправлено: metton от 29 Августа 2003, 01:21:44
2Wyclef
Про куки:
Я просто не могу понять, ЧТО пытается модифицировать это read-only value?

Про хедеры:
И всё-таки ЧТО в данном случае выводит хедеры?
Т.е. почему именно в данной конструкции:
print qq{
Content-Type: text/html};
допускаются поблажки?
Может, это какое-то свойство оператора qq?
Название: Странность с хедером и ещё...
Отправлено: Wyclef от 29 Августа 2003, 10:28:06
metton
Perl ругается при попытке обрезать undef, ИМХО...
Название: Странность с хедером и ещё...
Отправлено: metton от 29 Августа 2003, 12:29:55
2Wyclef
Так почему же он ругается только если обрезать внутри куки?
Если же отвдельно(первая строка), то не ругается же.
Название: Странность с хедером и ещё...
Отправлено: NeoNox от 29 Августа 2003, 12:45:21
perldoc perldiag:
Modification of a read‐only value attempted
           (F) You tried, directly or indirectly, to change the value of a
           constant.

Да потому что это уже сформированый обьект.
Название: Странность с хедером и ещё...
Отправлено: metton от 29 Августа 2003, 14:13:48
2NeoNox
Не понял. Можешь пояснить (насчёт объекта)?