Perl:如何检查CGI :: header是否已被调用?

时间:2013-10-09 20:52:45

标签: perl cgi cgi.pm

使用CGI::Carp,我想使用set_die_handler正常输出错误消息。

网页预计不会遇到错误,但如果确实发生错误,并且它已经在print header被调用之后的某个地方发生,它会将标题作为文本输出,并且页面很可能被错误地格式化。 / p>

正如问题所述,我想检查是否已经调用了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框架

2 个答案:

答案 0 :(得分:10)

没有记录,但CGI会跟踪是否已调用header

>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


>

答案 1 :(得分: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