尝试修改只读值开始出现在脚本中

  • 本文关键字:脚本 开始 修改 只读 perl
  • 更新时间 :
  • 英文 :


我试图弄清楚为什么这个错误会出现在Perl脚本中:

A fatal error has occured:
    Modification of a read-only value attempted at (eval 7) line 10.
Please enable debugging in setup for more details.

当我从命令行运行它时:

perl -d admin.cgi

它死的点是:

<p><font face='Tahoma,Arial,Helvetica' size=2>A fatal error has occured:</font></p><blockquote><pre>Modification of a read-only value attempted at (eval 14)[/home/user/public_html/cgi-bin/links/admin/GT/AutoLoader.pm:128] line 10.
</pre></blockquote><p><font face='Tahoma,Arial,Helvetica' size=2>Please enable debugging in setup for more details.</font></p>
Modification of a read-only value attempted at (eval 14)[/home/user/web/example.com/public_html/cgi-bin/links/admin/GT/AutoLoader.pm:128] line 10.
Debugged program terminated.  Use q to quit or R to restart,

查看 AutoLoader.pm 文件,我在第 128 行看到这个:

eval "package $pkg;n#line $linenum$pkg::$funcn$COMPILE->{$func}";

如果我添加更多调试:

print "FOO: $pkg ($func)n";

然后我在运行时看到这个:

FOO: GT::Template (_call_func)
FOO: GT::CGI (html_escape)
FOO: GT::Base (in_eval)
<p><font face='Tahoma,Arial,Helvetica' size=2>A fatal error has occured:</font></p><blockquote><pre>Modification of a read-only value attempted at (eval 7) line 10.
</pre></blockquote><p><font face='Tahoma,Arial,Helvetica' size=2>Please enable debugging in setup for more details.</font></p>
Modification of a read-only value attempted at (eval 7) line 10.

脚本在昨天的整个过程中都运行良好,我认为我没有更改任何会导致这种情况的东西 - 所以我有点不知所措。

更新:经过更多的挖掘,我发现它来自另一个模块中的这一行:

my $output = $code->($self);

$code似乎来自上面的一点:

my $root      = $self->{root};
my $full_file = $self->{root} . '/' . $template;
my ($code, $dont_save, $files) = $self->{opt}->{print} == 2
    ? @{$FILE_CACHE_PRINT{$full_file}}{qw/code dont_save files/}
    : @{$FILE_CACHE{$full_file}}{qw/code dont_save files/};

更新 2:根据要求,以下是print STDERR qq|package $pkg;n#line $linenum$pkg::$funcn$COMPILE->{$func}n|;的输出:

package GT::Base;
#line 538GT::Base::in_eval
sub in_eval {
# -------------------------------------------------------
# Current perl has a variable for it, old perl, we need to look
# through the stack trace. Ugh.
#
    my $ineval;
    if ($] >= 5.005 and !MOD_PERL) { $ineval = defined($^S) ? $^S : (stack_trace('GT::Base',1) =~ /(eval)/) }
    elsif (MOD_PERL) {
        my $stack = stack_trace('GT::Base', 1);
        $ineval = $stack =~ m{
            (eval)
            (?!
                s+called ats+
                (?:
                    /dev/null
                |
                    -e
                |
                    /S*/(?:Apache2?|ModPerl)/(?:Registry(?:Cooker)?|PerlRun).pm
                |
                    PerlHandler subroutine `(?:Apache2?|ModPerl)::Registry
                )
            )
        }x;
    }
    else {
        my $stack = stack_trace('GT::Base', 1);
        $ineval   = $stack =~ /(eval)/;
    }
    return $ineval;
}

<p><font face='Tahoma,Arial,Helvetica' size=2>A fatal error has occured:</font></p><blockquote><pre>Modification of a read-only value attempted at (eval 7) line 10.
</pre></blockquote><p><font face='Tahoma,Arial,Helvetica' size=2>Please enable debugging in setup for more details.</font></p>
Modification of a read-only value attempted at (eval 7) line 10.

啊,伙计 - 找到了!在站点配置中,它发生了一些奇怪的事情:

'db_cgi_url' => 'http://m.example.com/cgi-bin/links',
'db_cgi_url.' => 'http://m.example.com/cgi-bin/links',
'db_cgi_url..' => 'http://m.example.com/cgi-bin/links',
'db_cgi_url...' => 'http://m.example.com/cgi-bin/links',
'db_cgi_url....' => 'http://m.example.com/cgi-bin/links',
'db_cgi_url.....' => 'http://m.example.com/cgi-bin/links',
'db_cgi_url......' => 'http://m.example.com/cgi-bin/links',
'db_cgi_url.......' => 'http://m.example.com/cgi-bin/links',
'db_cgi_url........' => 'http://m.example.com/cgi-bin/links',
'db_cgi_url.........' => 'http://m.example.com/cgi-bin/links',
'db_cgi_url..........' => 'http://m.example.com/cgi-bin/links',
'db_cgi_url...........' => 'http://m.example.com/cgi-bin/links',

其他地方一定有东西在更新它,而我没有要求它。不在mod_perl下的前端似乎还可以,因为它使用的是缓存版本的 Data.pm

谢谢大家!

最新更新