我试图弄清楚为什么这个错误会出现在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
谢谢大家!