2009-07-30 3 views
4

私はapache2のでCGIスクリプトを実行すると、私は( Iが出力からのすべてのような行を削除)のerror.logにこの警告ラインを持っている:mod_perlで "定数を使用する"という警告を "再定義"するのはなぜですか?

 
[Thu Jul 30 09:39:37 2009] upload.pl: Constant subroutine ModPerl::ROOT::ModPerl::Registry::home_stanislav_cgi_perl_upload_2epl::UPLOAD_DIR redefined at /usr/share/perl/5.10/constant.pm line 115, line 133. 
Constant subroutine 
    ModPerl::ROOT::ModPerl::Registry::home_stanislav_cgi_perl_upload_2epl::BUFFER_SIZE redefined at /usr/share/perl/5.10/constant.pm line 115, line 133 (#1) 
[Thu Jul 30 09:39:37 2009] upload.pl: Constant subroutine ModPerl::ROOT::ModPerl::Registry::home_stanislav_cgi_perl_upload_2epl::BUFFER_SIZE redefined at /usr/share/perl/5.10/constant.pm line 115, line 133. 
Constant subroutine 
    ModPerl::ROOT::ModPerl::Registry::home_stanislav_cgi_perl_upload_2epl::MAX_FILE_SIZE redefined at /usr/share/perl/5.10/constant.pm line 115, line 133 (#1) 
[Thu Jul 30 09:39:37 2009] upload.pl: Constant subroutine ModPerl::ROOT::ModPerl::Registry::home_stanislav_cgi_perl_upload_2epl::MAX_FILE_SIZE redefined at /usr/share/perl/5.10/constant.pm line 115, line 133. 
Constant subroutine 
    ModPerl::ROOT::ModPerl::Registry::home_stanislav_cgi_perl_upload_2epl::MAX_DIR_SIZE redefined at /usr/share/perl/5.10/constant.pm line 115, line 133 (#1) 
[Thu Jul 30 09:39:37 2009] upload.pl: Constant subroutine ModPerl::ROOT::ModPerl::Registry::home_stanislav_cgi_perl_upload_2epl::MAX_DIR_SIZE redefined at /usr/share/perl/5.10/constant.pm line 115, line 133. 
Constant subroutine 
    ModPerl::ROOT::ModPerl::Registry::home_stanislav_cgi_perl_upload_2epl::MAX_OPEN_TRIES redefined at /usr/share/perl/5.10/constant.pm line 115, line 133 (#1) 
[Thu Jul 30 09:39:37 2009] upload.pl: Constant subroutine ModPerl::ROOT::ModPerl::Registry::home_stanislav_cgi_perl_upload_2epl::MAX_OPEN_TRIES redefined at /usr/share/perl/5.10/constant.pm line 115, line 133. 
Subroutine dir_size redefined at /home/stanislav/cgi/perl/upload.pl line 79, 
    line 133 (#2) 
[Thu Jul 30 09:39:37 2009] upload.pl: Subroutine dir_size redefined at /home/stanislav/cgi/perl/upload.pl line 79, line 133. 
Subroutine error redefined at /home/stanislav/cgi/perl/upload.pl line 90, 
    line 133 (#2) 
[Thu Jul 30 09:39:37 2009] upload.pl: Subroutine error redefined at /home/stanislav/cgi/perl/upload.pl line 90, line 133. 
Argument "" isn't numeric in numeric ge (>=) at 
    /home/stanislav/cgi/perl/upload.pl line 62 (#4) 
[Thu Jul 30 09:39:37 2009] -e: Argument "" isn't numeric in numeric ge (>=) at /home/stanislav/cgi/perl/upload.pl line 62. 
Filehandle OUTPUT opened only for input at /home/stanislav/cgi/perl/upload.pl 
    line 69 (#5) 
[Thu Jul 30 09:39:37 2009] -e: Filehandle OUTPUT opened only for input at /home/stanislav/cgi/perl/upload.pl line 69. 
Constant subroutine 
    ModPerl::ROOT::ModPerl::Registry::home_stanislav_cgi_perl_upload_2epl::UPLOAD_DIR redefined at /usr/share/perl/5.10/constant.pm line 115, line 133 (#1) 

この行があると停止する方法があるのはなぜそれら? (固定いくつかの バグ著書「PerlでCGIプログラミング」から取られた、)この警告を作る

コード:



#!/usr/bin/perl 
use strict; 
use warnings; 


use CGI; 
use CGI::Carp; 
#use diagnostics qw/-verbose/; 

use Fcntl qw(:DEFAULT :flock); 
use constant UPLOAD_DIR  => "/tmp/test_upload/"; 
use constant BUFFER_SIZE => 16_384; 
use constant MAX_FILE_SIZE => 1_048_576;  # Limit each upload to 1 MB 
use constant MAX_DIR_SIZE => 100 * 1_048_576; # Limit total uploads to 100 MB 
use constant MAX_OPEN_TRIES => 100; 

$CGI::DISABLE_UPLOADS = 0; 
$CGI::POST_MAX   = MAX_FILE_SIZE; 
my $q = new CGI; 
$q->cgi_error and error($q, "Error transferring file: " . $q->cgi_error); 
my $file  = $q->param("file")  || error($q, "No file received."); 
my $filename = $q->param("filename") || error($q, "No filename entered."); 
my $fh  = $q->upload("file")  || error($q, "Something is wrong with file handle."); 
#my $fh  = $q->upload($file); 
my $buffer = ""; 
if (dir_size(UPLOAD_DIR) + $ENV{CONTENT_LENGTH} > MAX_DIR_SIZE) { 
    error($q, "Upload directory is full."); 
} 
# Allow letters, digits, periods, underscores, dashes 
# Convert anything else to an underscore 
$filename =~ s/[^\w.-]/_/g; 
if ($filename =~ /^(\w[\w.-]*)/) { 
    $filename = $1; 
} 
else { 
    error($q, "Invalid file name; files must start with a letter or number."); 
} 
# Open output file, making sure the name is unique 
until (sysopen OUTPUT, UPLOAD_DIR . $filename, O_CREAT | O_EXCL) { 
    $filename =~ s/(\d*)(\.\w+)$/($1||0) + 1 . $2/e; 
    $1 >= MAX_OPEN_TRIES and error($q, "Unable to save your file."); 
} 
# This is necessary for non-Unix systems; does nothing on Unix 
binmode $fh; 
binmode OUTPUT; 
# Write contents to output file 
while (read($fh, $buffer, BUFFER_SIZE)) { 
    print OUTPUT $buffer; 
} 
close OUTPUT; 

if (-T $fh) { 
    print $q->header("text/plain"); 
    seek $fh, 0, 0; 
    map { print } ; 
} 

sub dir_size { 
    my $dir = shift; 
    my $dir_size = 0; 

    # Loop through files and sum the sizes; doesn't descend down subdirs 
    opendir DIR, $dir or die "Unable to open $dir: $!"; 
    while ($_ = readdir DIR) { 
     $dir_size += -s "$dir/$_"; 
    } 
    return $dir_size; 
} 
sub error { 
    my($q, $reason) = @_; 

    print $q->header("text/html"), 
      $q->start_html("Error"), 
      $q->h1("Error"), 
      $q->p("Your upload was not procesed because the following error ", 
       "occured: "), 
      $q->p($q->i($reason)), 
      $q->end_html; 
    exit; 
} 

このコードでは、同様の出力を持っている: は$ perl -e 'sub FOO() { 1 } BEGIN{ *FOO = sub() { 2 }; } print FOO;'

Constant subroutine main::FOO redefined at -e line 1.

I did put no warnings qw/redefine/それは助けにはなりませんでした。

答えて

5

あなたのスクリプトを修正して、スクリプトをインライン化の対象となるサブルーチンのためmod_perlによって再コンパイルされたときに私の知る限り、あなただけのこれらの警告を取得します。サブルーチンが再コンパイルされるとき、それが返す値が変更された場合、その新しい値は以前にインライン化された場所に反映されません。

たとえば、BUFFER_SIZEの値を変更する場合は、apacheを再起動する必要があります。

また、mod_perl/Apache::Registry accidental closuresはあなたのスクリプトに関連していると思います。

1

FOOの最初の定義が最適化されています。体内のステートメントで定義してください。エラーが表示されなくなったと思います。

$ perl -e 'sub FOO() { print 1; } BEGIN{ *FOO = sub() { 2 }; } print FOO;'

関連する問題