我需要用 Defined(@array) 和 Defined(%hash) 重构一段古老的 Perl 代码

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而且我不太确定如何做到这一点。

mob*_*mob 5

$ 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)在布尔上下文中。

  • 呃,不,它没有指示数组是否为空 - 它指示该数组是否曾经被使用过。即使数组现在为空,这也会在较旧的 perls 上打印 true:@a = 1; @a = (); 如果定义了@a,则打印“true\n”; (3认同)