use File::Spec;
use strict;
+use warnings;
-our $VERSION = '3.19';
+our $VERSION = '3.22_02';
# Subs in this package:
# _default_error($plain, $html) Default error handler
print "Status: $type\nContent-Type: text/html\n\n",
qq{<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">\n<html>},
"<head>\n<title>$type $short</title>\n</head></body>\n<h1>$short",
- "</h1>\n$long<p>\n<hr>\n$ENV{SERVER_SIGNATURE}</body></html>";
+ "</h1>\n$long<p>\n<hr>\n";
+ print $ENV{SERVER_SIGNATURE} if $ENV{SERVER_SIGNATURE};
+ print "</body></html>";
}
}
# Wrap old request handlers.
sub everything {
require PLP::Backend::CGI;
- PLP::Backend::CGI::everything();
+ PLP::Backend::CGI->everything();
}
sub handler {
require PLP::Backend::Apache;
sub sendheaders () {
$PLP::sentheaders ||= [ caller 1 ? (caller 1)[1, 2] : (caller)[1, 2] ];
print STDOUT "Content-Type: text/plain\n\n" if $PLP::DEBUG & 2;
- print STDOUT map("$_: $PLP::Script::header{$_}\n", keys %PLP::Script::header), "\n";
+ while (my ($header, $values) = each %PLP::Script::header) {
+ print STDOUT "$header: $_\n" for split /\n/, $values;
+ }
+ print STDOUT "\n";
}
{
# No lexicals may exist at this point.
- eval qq{ package PLP::Script; $PLP::code; };
+ eval qq{ package PLP::Script; no warnings; $PLP::code; };
PLP::error($@, 1) if $@ and $@ !~ /\cS\cT\cO\cP/;
- eval { package PLP::Script; $_->() for reverse @PLP::END };
+ eval { package PLP::Script; no warnings; $_->() for reverse @PLP::END };
PLP::error($@, 1) if $@ and $@ !~ /\cS\cT\cO\cP/;
}
PLP::sendheaders() unless $PLP::sentheaders;
Not only syntax is important, you should also be aware of some other important
features. Your script runs inside the package C<PLP::Script> and shouldn't
leave it. This is because when your script ends, all global variables in the
-C<PLP::Script> package are destroyed, which is very important if you run under
-mod_perl (they would retain their values if they weren't explicitly destroyed).
+C<PLP::Script> package are destroyed, which is very important if you run a
+persistent backend (they would retain their values if they weren't explicitly
+destroyed).
Until your first output, you are printing to a tied filehandle C<PLPOUT>. On
first output, headers are sent to the browser and C<STDOUT> is selected for
BEGIN blocks. BEGIN blocks are executed as soon as possible, before anything
else.
-Because the interpreter that mod_perl uses never ends, C<END { }> blocks won't
-work properly. You should use C<PLP_END { };> instead. Note that this is a not
-a built-in construct, so it needs proper termination with a semi-colon (as do
-C<eval> and C<do>).
+Unless you're running as CGI, the interpreter won't exit after processing a page,
+so C<END { }> blocks won't work properly. You should use C<PLP_END { };> instead.
+Note that this is a not a built-in construct, so it needs proper termination
+with a semi-colon (as do C<eval> and C<do>).
-Under mod_perl, modules are loaded only once. A good modular design can improve
-performance because of this, but you will have to B<reload> the modules
+When run persistently, modules are loaded only once. A good modular design can
+improve performance because of this, but you will have to B<reload> the modules
yourself when there are newer versions.
The special hashes are tied hashes and do not always behave the way you expect,