Почему я получаю & # 8220; переопределить & # 8221; предупреждения с & # 8220; использовать константу & # 8221; под mod_perl?

StackOverflow https://stackoverflow.com/questions/1205116

  •  05-07-2019
  •  | 
  •  

Вопрос

Я запускаю CGI-скрипт с apache2, и у меня есть это предупреждение в error.log ( я удалил все похожие строки из вывода ):

[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)

Почему существуют эти строки и есть ли способ их остановить?

Код, который выдает это предупреждение (взят из книги «Программирование CGI с Perl», с некоторыми исправлены ошибки):



#!/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 ( 

Я запускаю CGI-скрипт с apache2, и у меня есть это предупреждение в error.log ( я удалил все похожие строки из вывода ):

[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)

Почему существуют эти строки и есть ли способ их остановить?

Код, который выдает это предупреждение (взят из книги «Программирование CGI с Perl», с некоторыми исправлены ошибки):

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

Этот код имеет похожий вывод: $ perl -e 'sub FOO () {1} BEGIN {* FOO = sub () {2}; } распечатать FOO; '

<*>

Я не поместил предупреждений qw / redefine / , но это не помогло.

= readdir DIR ) { $dir_size += -s "$dir/

Я запускаю CGI-скрипт с apache2, и у меня есть это предупреждение в error.log ( я удалил все похожие строки из вывода ):

[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)

Почему существуют эти строки и есть ли способ их остановить?

Код, который выдает это предупреждение (взят из книги «Программирование CGI с Perl», с некоторыми исправлены ошибки):

<*>

Этот код имеет похожий вывод: $ perl -e 'sub FOO () {1} BEGIN {* FOO = sub () {2}; } распечатать FOO; '

<*>

Я не поместил предупреждений qw / redefine / , но это не помогло.

"; } 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}; } распечатать FOO; '

<*>

Я не поместил предупреждений qw / redefine / , но это не помогло.

Это было полезно?

Решение

AFAIK, вы получаете эти предупреждения только тогда, когда вы модифицируете свой сценарий, а затем сценарий перекомпилируется с помощью mod_perl для подпрограмм, подходящих для встраивания. Когда подпрограмма перекомпилируется, если возвращаемое значение изменилось, это новое значение не будет отражено в тех местах, где оно было ранее встроено.

Если вы измените значение, скажем, BUFFER_SIZE , вам следует перезапустить apache .

Я также думаю, что mod_perl / Apache :: Случайные закрытия реестра имеет отношение к вашему сценарию.

Другие советы

По-видимому, первое определение FOO оптимизируется. Определите его с помощью оператора в теле, и я думаю, вы обнаружите, что ошибка исчезает.

<код> $ perl -e 'sub FOO () {print 1; } BEGIN {* FOO = sub () {2}; } печатать FOO; '

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top