CGI.pmにおけるOSの選別

CGI.pmでのmod_perlの判定とか前々から気になっていたので
ソースコード見てみました。

「new」したときの判定は以下

if ($MOD_PERL) {
if ($MOD_PERL == 1) {
$self->r(Apache->request) unless $self->r;
my $r = $self->r;
$r->register_cleanup(\&CGI::_reset_globals);
}
else {
# XXX: once we have the new API
# will do a real PerlOptions -SetupEnv check
$self->r(Apache2::RequestUtil->request) unless $self->r;
my $r = $self->r;
$r->subprocess_env unless exists $ENV{REQUEST_METHOD};
$r->pool->cleanup_register(\&CGI::_reset_globals);
}

で、その前に環境変数で「require」選択してました。

if (exists $ENV{MOD_PERL}) {
# mod_perl handlers may run system() on scripts using CGI.pm;
# Make sure so we don't get fooled by inherited $ENV{MOD_PERL}
if (exists $ENV{MOD_PERL_API_VERSION} && $ENV{MOD_PERL_API_VERSION} == 2) {
$MOD_PERL = 2;
require Apache2::Response;
require Apache2::RequestRec;
require Apache2::RequestUtil;
require Apache2::RequestIO;
require APR::Pool;
} else {
$MOD_PERL = 1;
require Apache;
}
}


何でしょうね?この人たち。

require Apache2::Response;
require Apache2::RequestRec;
require Apache2::RequestUtil;
require Apache2::RequestIO;
require APR::Pool;


ついでに、よくお目にかかる「Method: param」とかもみました。

Returns the value(s)of a named parameter. If invoked in a list context, returns the entire list. Otherwise returns the first member of the list. If name is not provided, return a list of all the known parameters names available. If more than one argument is provided, the second and subsequent arguments are used to set the value of the parameter.

で、更についでにOS判定文が目に入ったのでみてみました。

if ($OS =~ /^MSWin/i) {
$OS = 'WINDOWS';
} elsif ($OS =~ /^VMS/i) {
$OS = 'VMS';
} elsif ($OS =~ /^dos/i) {
$OS = 'DOS';
} elsif ($OS =~ /^MacOS/i) {
$OS = 'MACINTOSH';
} elsif ($OS =~ /^os2/i) {
$OS = 'OS2';
} elsif ($OS =~ /^epoc/i) {
$OS = 'EPOC';
} elsif ($OS =~ /^cygwin/i) {
$OS = 'CYGWIN';
} else {
$OS = 'UNIX';
}


その他は皆UNIXだったんですね。 hoge




参照:
http://search.cpan.org/src/LDS/CGI.pm-3.16/CGI.pm