【问题标题】:Perl RegistryCooker.pm is producing hash errorPerl RegistryCooker.pm 产生哈希错误
【发布时间】:2014-05-16 17:45:08
【问题描述】:

我在运行 ubuntu 的 Web 服务器上设置了 OTRS,当我尝试访问同一系统上的单独 perl 应用程序时出现此错误:

[perl:error] [pid 4649] [client IP:20534] 
Use of each() on hash after insertion without resetting hash iterator results in undefined behavior, 
Perl interpreter: 0x7f006d2d3830 at /usr/lib/perl5/ModPerl/RegistryCooker.pm line 526.
\n, referer: http://URL/otrs/index.pl?Session=100842489b87151dd7e4495da5b1b7d138

我真的不知道是什么导致了这种情况,因为我对 perl 还很陌生。如果有人知道我可以从哪个方向开始调查,那就太好了。

【问题讨论】:

  • perl -we'%h=(a=>1,b=>2); while (each(%h)){ $h{c}=3; }'
  • 好的,这确实会产生相同的结果,数组越界。问题是它引用了发生错误的 perl 模块。我想我需要检查数据库是否设置了所有键
  • 数组越界???不,那里没有数组。
  • @ikegami,不是数组,但所使用的结构在请求的键处没有值
  • 关于“使用的结构在请求的键处没有值”你在说什么?!?!?!?!问题是插入到您正在使用 each 迭代的哈希中。

标签: linux perl otrs


【解决方案1】:

你正在运行 mod_perl 吗?如果是这样,请尝试禁用它(用于测试)并检查错误是否仍然出现。也有可能展台应用程序尝试运行 mod_perl 你需要一个特殊的配置。

问候

汉尼斯

【讨论】:

    【解决方案2】:

    来自 perldoc 的perldiag 页面:

    插入后在哈希上使用 each() 而不重置哈希迭代器会导致未定义的行为

    (S internal) each() 插入后的行为是不确定的,它可能会跳过项目,或者多次访问项目。考虑使用 keys() 而不是 each()。

    我会考虑将您对 each() 的使用改为使用 keys()。例如:

    while (my ($key, $value) = each(%hash)) {
        # ...
    }
    

    变成:

    for my $key (keys %hash) {
        my $value = $hash{$key};
        # ...
    }
    

    这样,您正在循环的键在第一次循环之前设置为固定值,并且不会发生未定义的行为。

    【讨论】:

      猜你喜欢
      • 2014-11-08
      • 2019-07-22
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2012-11-19
      相关资源
      最近更新 更多