我已经在以下链接中搜索了关于这个问题的几个主题,并且在完全相同的上下文(在linux上运行diogenes),但由于提交中的含糊不清,它已被关闭:
Running old perl script (2007)
所以,错误信息是这样的:
Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at /usr/local/diogenes/perl/CPAN/CGI.pm line 449.
Compilation failed in require at ./diogenes-server.pl line 42.
BEGIN failed--compilation aborted at ./diogenes-server.pl line 42.
在CGI.pm的第449行有这样的:
if (defined(@QUERY_PARAM) && !defined($initializer)) {
因此,阅读一下,似乎这个代码是错误的,并且在较新版本的perl中已被弃用。作为Diogenes这样一个旧软件似乎是正确的。那么,我怎样才能重写这个以便继续前进。
最后,我正在按照本教程关于如何在linux上运行diogenes并且没有关于perl编程的线索:http://community.dur.ac.uk/p.j.heslin/Software/Diogenes/linux_install.php。
:)
如defined
中所述(并在错误消息中提到),请尝试更改此:
if (defined(@QUERY_PARAM) && !defined($initializer)) {
进入这个:
if (@QUERY_PARAM && !defined($initializer)) {
问题不是Diogenes本身。问题是Diogenes打包了它使用的所有CPAN模块,其中包括2004年的CGI.pm版本。
这不会是一个问题,除了你在更新版本的Perl-Perl 5.22或更高版本上运行它。 perldelta for Perl 5.22包括:
定义的(@array)和定义的(%hash)现在是致命的错误
自v5.6.1起,这些已被弃用,并且自v5.16起已提出弃用警告。
那么这里发生的是:
看起来你有三个选择:
defined(@QUERY_PARAM)
替换@QUERY_PARAM
。在评论中,你提到在我的列表上尝试最后一个建议并得到一个不同的问题。看起来这也是由于Diogenes上次更新后的12年间Perl语法(这次是正则表达式语法)的变化引起的。而且,当然,修复它可能会揭示另一个类似的问题。
总而言之,可能值得联系Diogenes的作者并解释您使用现代版本的Perl软件所遇到的问题。即使作者没有时间解决问题,他们也可能会在网站上添加警告,告诉人们这些问题。
尝试将其更改为exists
。
如果目的是测试非空虚,这也有效:
if (@QUERY_PARAM && !$initializer) {