【问题标题】:References to hash insideanother hash give Use of uninitialized value in concatenation (.) or string对另一个哈希内的哈希的引用给出了在连接 (.) 或字符串中使用未初始化的值
【发布时间】:2018-10-19 21:06:55
【问题描述】:

我有一个对象$burStageStats,我用数据填充。

my $additional_event_details = {
                        'status'     => '\N',
                        'duration'   => '\N',
                        'keyword'    => $keyword
            };
            my $statsHash = {
                        'time'   => '\N',
                        'event_type'     => 'INFO',
                        'backup_stage'   => '\N',
                        'additional_event_details'    => $additional_event_details
            };
            push (@burStageStats, $statsHash);

稍后我循环并将值打印到 BCP 文件

foreach my $backup (@{$burStageStats}) {
    foreach my $backupStage ($backup) {
        print BCP "$siteId\t" . $backupStage->{'time'} . "\t" .
                  $backupStage->{'event_type'} . "\t" .
                  $stageIdMap->{$backupStage->{'additional_event_details'}->{'backup_stage'}} . "\n";
    }
}

我收到以下错误

在 /data/ddp/current/analysis/TOR/bur/parseburLog 第 180 行、第 11287 行的连接 (.) 或字符串中使用未初始化的值。

我想这指向我在该行中引用的方式

              $stageIdMap->{$backupStage->{'additional_event_details'}->{'backup_stage'}} . "\t" .

但我不确定如何正确编写该行。该代码有效,但我希望明显减少错误报告。

【问题讨论】:

  • 你使用的是严格和警告吗?
  • 是的,这两个都用
  • 就像您之前的问题一样,您未能证明您的问题。如果你连问题都描述不出来,你怎么能指望解决它?请参阅minimal reproducible example 了解如何执行此操作。
  • 为什么在 foreach 循环中使用 @{$burStageStats} 而不是直接使用 @burStageStats

标签: perl


【解决方案1】:

警告告诉我们$backupStage->{'additional_event_details'}->{'backup_stage'} 返回的值在$stageIdMap 引用的哈希中不存在。例如,如果 $backupStage->{'additional_event_details'}->{'backup_stage'} 是 'foo',则 $stageIdMap->{'foo'} 缺失或未定义。

鉴于您问题顶部的示例数据,我注意到该示例数据中不存在 $backupStage->{'additional_event_details'}->{'backup_stage'} - $additional_event_details 哈希不包含 backup_stage 键。 backup_stage 位于 $statsHash,而不是 $backupStage->{'additional_event_details'}。这似乎是根本问题,因为很有可能$stageIdMap->{undef}(对于实际的undef,而不是字符串'undef')不存在。

如果您要提供一个简短的、独立的示例程序,我们可以自己运行它以查看实际问题,那么我们将能够提供更明确(并且可能更有用)的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多