【问题标题】:Looks like a Perl CGI bug看起来像 Perl CGI 错误
【发布时间】:2016-07-06 03:54:34
【问题描述】:

Perl 版本 5.8.5 我有:

my @dt = qw( 1 0 );
my %dt = qw( 1 single 0 multi );
my $val = 0;

$cgi->popup_menu( {
    -name    => "test",
    -default => $val,
    -values  => \@dt,
    -labels  => \%dt,
} )

在弹出窗口中一切正常,除了“已选择”从未设置。 所以总是选择第一个 val。

如果我进行更改,并在所有情况下将 0 更改为 2($val@dt%dt),那么一切正常,并且我在 HTML 标记中得到“选中”。

我也将代码处理到 Perl 5.8.8 框,它在那里工作 零?我是否需要让我们的系统管理员在 5.8.5 机器上提升我们的 Perl 版本?

【问题讨论】:

  • 仅供参考,使用 CGI.pm 中的 HTML 生成功能现在是 officially discouraged。你真的应该使用像 Template Toolkit 这样的模板引擎。此外,Perl 5.8.5 真的老了(2004 年发布); 5.24.0 刚刚发布!也许您对这个设置感到困惑,但如果您有任何选择,请更新您的工具集!

标签: perl popup cgi


【解决方案1】:

您可以通过 CPAN 独立于 perl 本身更新 CGI

如果您包含相关的使用语句和模块版本,以及示例 HTML 输出,将会很方便。

更新:看起来您的 perl 版本应该使用 CGI 3.05(参见 Module::CoreList)。检查 CGI 的更改日志,我们发现这是一个已知错误。

3.45 版,2009 年 8 月 14 日 [BUG修复] 3. 允许在popup_menu() 中使用0 作为默认值。这从 3.37 开始就被打破了。感谢 Haze,他是第一个报告此问题并提供补丁的人,以及 pfschill,他指出了该错误何时被引入。还添加了对此的回归测试。 (RT#37908)

(他们可能没有正确剖析(重新)引入的错误)​​

附:而不是单独的@dt 只需将-values 设置为[ sort keys %dt ]

【讨论】:

  • 我没有 root(公司框),所以我无法安装 perl。我的值并不总是排序的,但很好的提示可能会很方便......代码在一个窗口框上,所以我无法复制到这里,......但是除了 0 时缺少“选定”字词之外,HTML 是相同的用过的。我从 1996 年开始使用 Perl,每次我认为我看到了一个错误,它不是。但在这种情况下,这是我唯一合乎逻辑的结论。我用谷歌搜索“Perl build notes”以查看是否提到了这个问题,但搜索中没有任何注释.....
  • 一般的你。我是在指出没有必要升级 perl 来升级核心模块。也不需要 Root,因为您可以 require 使用完整路径名来加载更新的本地副本;只是众多方法中的一种。
  • @belg4mit: CGI 无论如何都不再是核心模块——它已被弃用并从最新的 Perl 发行版中删除
  • @user3250422:请注意,安装 Perl 模块不需要 root 访问权限。只要您有必要的工具,您就可以安装它仅供您自己使用。而且我不明白为什么源文件位于 Windows 系统上(请不要在此处使用贬义名称——它应该是一个专业平台)阻止您在此处发布它。当然,如果您可以阅读它,那么您可以复制并粘贴它
  • 如果他们有 3.05 版,他们就不会受到变更日志所说的在 3.37 中引入的错误的影响...
【解决方案2】:

您可能是正确的,并且您运行的是旧版本的 CGI 模块

perl -MCGI -e 'print $CGI::VERSION, "\n"' 产生什么?而在v5.8.8系统上呢?

我正在运行 CGI 的 4.28 版,结果看起来正确

<select name="test" >
<option value="1">single</option>
<option selected="selected" value="0">multi</option>
</select>

无论如何,您可能会从升级中受益,因为即使 Perl v5.8.8 已经有十多年的历史了,但是如果更容易的话,您应该可以只升级 CGI 模块。事实上,该模块现在已被弃用,不再是核心模块,因此升级到 Perl v5.24 之后必须安装 CGI 才能恢复功能

CGI 功能不应该与 HTML 生成组合在同一个模块中,即使那些继续使用 CGI(它被广泛认为已被 PSGI 取代)的人也更喜欢使用单独的模块,如 CGI::SimpleCGI::Minimal 一起 HTML::Tiny 用于生成 HTML

belg4mit has identified,您发现的错误已在 CGI 模块的 3.4.5 版中修复,该模块最初是作为开发版本 Perl v5.11.0 的一部分发布的。随后的第一个公共 Perl 版本是 v5.12,其中包含模块的 3.4.8 版

由于您发现安装 Perl v5.8.8 没有显示问题,很可能该机器上的 CGI 模块已独立于 Perl 升级

【讨论】:

  • 相信我——如果升级是一种选择,我们总是会非常接近最新的。但是在这家公司,要让 unix 管理员为我们做任何事情都是不可能的。这是一个 JAVA/ORACLE 业务,他们总是在最新的一切。但如果我们要求任何东西,我们就是红发继子......
  • 只是你写了“我需要让我们的系统管理员在 5.8.5 机器上升级我们的 Perl 版本吗?”,所以我认为这是可行的解决方案。不要忘记,正如我所说,您可以在本地机器上安装自己的 CGI 副本并使用它进行测试
  • 这就是it looks like Oracle are killing off?!坚持开源的Java!
猜你喜欢
  • 1970-01-01
  • 2012-05-14
  • 2017-10-12
  • 1970-01-01
  • 2016-03-09
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多