CGI.pm を使って200以外のステータスコードを返すには、
my $cgi = new CGI; print $cgi->header( -status => '404 Not Found', ); print $error_document; # 自前のエラードキュメントを出力。
のようにすればいいのですが、mod_perl環境下で上のコードを実行すると、自前のエラードキュメントに続いてApacheもエラードキュメントを出力してしまいます(だいたい200以外のステータスコードを返したいようなときは自前のエラードキュメントを出力したいに決まってる)。
これを避けるためには、mod_perl環境下のときだけNPHスクリプトとして動作させるようにすればいいです。
my $cgi = new CGI; print $cgi->header( -status => '404 Not Found', -nph => $ENV{MOD_PERL}, ); print $error_document; # 自前のエラードキュメントを出力。
このとき、httpd.conf のmod_perlの設定で、PerlSendHeader を Off にしておく必要があります(デフォルトはOff)。
ただし、NPHスクリプトとして動作させると、access_logの出力のステータスコードが一律200になってしまい、出力したコンテンツのサイズも記録されません。
ちょっとやな感じですね。