mig*_*g81 1 perl cgi movabletype
我正在运行一个古老版本的 Movable Type,它对我来说效果很好。但是,我开始收到以下服务器错误:
defined(@array) is deprecated at /home/public_html/cgi-bin/mt/extlib/Locale/Maketext.pm line 623.
defined(%hash) is deprecated at /home/public_html/cgi-bin/mt/extlib/Locale/Maketext.pm line 623.
Run Code Online (Sandbox Code Playgroud)
我找到了有问题的行:
if defined(%{$module . "::Lexicon"}) or defined(@{$module . "::ISA"});
Run Code Online (Sandbox Code Playgroud)
以下是重构这一行的正确方法吗?
if %{$module . "::Lexicon"} or @{$module . "::ISA"};
Run Code Online (Sandbox Code Playgroud)
如果是这样,为什么?如果没有,为什么不呢?我想更好地了解defined(@array)和发生了什么defined(%hash)。
更新:我还在第 367 行发现了类似的问题CGI.pm:
if (defined(@QUERY_PARAM) && !defined($initializer)) {
Run Code Online (Sandbox Code Playgroud)
我重写了如下,但我仍然不确定它是否正确:
if (@QUERY_PARAM && $initializer) {
Run Code Online (Sandbox Code Playgroud)
我可以看到如何@QUERY_PARAM确认它存在,但我可能没有设置第二个不存在的条件$initializer,而且我不太确定如何做到这一点。
$ perl -w -Mdiagnostics -e 'print defined(@array)'
Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at -e
line 1 (#1)
(F) defined() is not useful on arrays because it
checks for an undefined scalar value. If you want to see if the
array is empty, just use if (@array) { # not empty } for example.
Uncaught exception from user code:
Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at -e line 1.
Run Code Online (Sandbox Code Playgroud)
$ [perldoc -f defined](http://metacpan.org/pod/perlfunc#define)
...
Use of "defined" on aggregates (hashes and arrays) is no longer
supported. It used to report whether memory for that aggregate
had ever been allocated. You should instead use a simple test
for size:
if (@an_array) { print "has array elements\n" }
if (%a_hash) { print "has hash members\n" }
Run Code Online (Sandbox Code Playgroud)
该defined(@array)构造从未达到用户期望的效果,而且它实际所做的也没有那么有用,因此它被从语言中删除(并且在您使用的 Perl 版本中已弃用)。正如诊断和文档所建议的,修复它的方法是仅使用@array而不是defined(@array)在布尔上下文中。