使用弃用的perl脚本来运行diogenes,我如何为新版本重写此代码?

问题描述 投票:0回答:3

我已经在以下链接中搜索了关于这个问题的几个主题,并且在完全相同的上下文(在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

:)

perl
3个回答
3
投票

defined中所述(并在错误消息中提到),请尝试更改此:

if (defined(@QUERY_PARAM) && !defined($initializer)) {

进入这个:

if (@QUERY_PARAM && !defined($initializer)) {

2
投票

问题不是Diogenes本身。问题是Diogenes打包了它使用的所有CPAN模块,其中包括2004年的CGI.pm版本。

这不会是一个问题,除了你在更新版本的Perl-Perl 5.22或更高版本上运行它。 perldelta for Perl 5.22包括:

定义的(@array)和定义的(%hash)现在是致命的错误

自v5.6.1起,这些已被弃用,并且自v5.16起已提出弃用警告。

那么这里发生的是:

  • Diogenes包含一个非常旧版本的CGI.pm,它使用了不推荐的语法。
  • Diogenes不包含Perl编译器的版本。
  • 您现在使用的Perl版本已将此不推荐使用的语法警告转换为致命错误。

看起来你有三个选择:

  • 降级到Perl的早期版本(5.22之前版本),这只会警告这种语法。
  • 删除Diogenes安装的CGI.pm副本,并从CPAN安装最新版本的CGI.pm(版本3.60,2012年发布,修复了此错误)。
  • 破解你的Diogenes安装的CGI.pm副本,用defined(@QUERY_PARAM)替换@QUERY_PARAM

在评论中,你提到在我的列表上尝试最后一个建议并得到一个不同的问题。看起来这也是由于Diogenes上次更新后的12年间Perl语法(这次是正则表达式语法)的变化引起的。而且,当然,修复它可能会揭示另一个类似的问题。

总而言之,可能值得联系Diogenes的作者并解释您使用现代版本的Perl软件所遇到的问题。即使作者没有时间解决问题,他们也可能会在网站上添加警告,告诉人们这些问题。


-2
投票

尝试将其更改为exists

如果目的是测试非空虚,这也有效:

if (@QUERY_PARAM && !$initializer) {

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.