2

CGI::Carpを使用set_die_handlerして、エラー メッセージを適切に出力し たいと考えています。

Web ページでエラーが発生することは想定されていませんが、print header既に呼び出された後のどこかでエラーが発生した場合は、ヘッダーがテキストとして出力され、ページが正しくフォーマットされない可能性が高くなります。

質問にあるように、CGI::header() が既に呼び出されているかどうかを確認したいと思います。これは、グローバル変数を使用して、関数が呼び出される可能性のあるすべての場所に設定することで実行できますが、これが内部で既に実行されていることを願っています。または、すでに STDOUT に送信されたものを解析する方法があるかもしれません。動作しないコードの例:

BEGIN {
   set_die_handler(
       sub {
           print header if not CGI::header_called;
           # or possibly,something like: if (<STDOUT> !~ /Content\-Type/)
           ...
       });
}

注:
CGI.pm の年齢に関連するコメントは受け入れられますが、すぐに却下されます :) Perl には MVC フレームワークがあることがわかりました

4

2 に答える 2

10

header文書化されていませんが、CGIは既に呼び出されているかどうかを追跡します。

>perl -e"use CGI qw( :cgi ); print header; print header;"
Content-Type: text/html; charset=ISO-8859-1

Content-Type: text/html; charset=ISO-8859-1


>perl -e"use CGI qw( :cgi -unique_headers ); print header; print header;"
Content-Type: text/html; charset=ISO-8859-1


>
于 2013-10-09T21:04:16.373 に答える
1

CGI.pm は、この情報を という属性で追跡します.header_printed。これは、必要に応じて確認できます。これは内部機能であり、文書化されていないため、将来のバージョンでの動作が保証されないことに注意してください。

$ perl -MCGI -E'$c = CGI->new; say $c->header unless $c->{".header_printed"}; say $c->header unless $c->{".header_printed"};'
Content-Type: text/html; charset=ISO-8859-1
于 2013-10-10T09:42:51.863 に答える