2

使用CGI::Carp,我想用它set_die_handler来优雅地输出错误消息。

网页预计不会遇到错误,但如果确实发生并且在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

It's not documented, but CGI does keep track of whether header has already been called or not.

>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 回答