【问题标题】:Perl throws "keys on reference is experimental"Perl 抛出“参考键是实验性的”
【发布时间】:2015-04-14 04:39:15
【问题描述】:

开发环境为OS X 10.10.3, Perl -v

This is perl 5, version 18, subversion 2 (v5.18.2) built for darwin-thread-multi-2level
(with 2 registered patches, see perl -V for more detail)

问题来了

我将项目从本地环境移动到 Windows Server,现在出现以下错误:

“参考键在 CGI/Router.pm 第 94 行是实验性的。”

模块第94行显示

my $num_regexes = scalar keys $token_regexes;

整个模块可以在这里找到https://github.com/kristiannissen/CGIRouter

我这样实例化路由器模块

$router->add_route( 'GET', '/home', sub {
 print header( -type => 'text/html', -charset => 'utf-8' );

 print "Hello Pussy";
});

我在本地没有这个问题,但是现在我正在迁移到生产服务器,我遇到了这个问题。据我所知,它与特定的 Perl 版本有关,但在我要求提供商升级 Perl 之前,我想知道是否有什么办法可以避免这个问题?

【问题讨论】:

    标签: perl cgi


    【解决方案1】:

    键的文档perldoc keys 有关于在哈希引用上使用键的说法:

    从 Perl 5.14 开始,键可以采用标量 EXPR,它必须包含对 unblessed 散列或数组的引用。该参数将被自动取消引用。密钥的这一方面被认为是高度实验性的。在 Perl 的未来版本中,确切的行为可能会发生变化。

    for (keys $hashref) { ... }
    

    为避免此问题,升级 Perl 将无济于事。该模块需要更新以按预期方式使用密钥,而不是使用实验性功能。也就是说,它需要在调用keys之前取消引用hashref。

    具体来说,改变

    my $num_regexes = scalar keys $token_regexes;
    

    my $num_regexes = scalar keys %$token_regexes;
    

    【讨论】:

      猜你喜欢
      • 2016-10-11
      • 1970-01-01
      • 1970-01-01
      • 2020-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多