变量值正确但显示 'uninitialized value' 警告

Variable has correct value but 'uninitialized value' warning is shown

有一个包含一些数据的散列,我对它的用户部分感兴趣。

my %users = %{$data{'users'}};
foreach my $user_key (keys %users){
        print Dumper $users{$user_key};
        my $mailtime      =  $users{$user_key}{'mail_time'};
        my $id_local       =  $users{$user_key}{'id_local'};
        my $id_global      =  $users{$user_key}{'id_global'};
        print $mailtime;
}

除第 print $mailtime.
行抛出的警告外,一切正常 即使是 print 命令也会输出正确的值以及无意义的警告,如下所示。

Use of uninitialized value $mailtime in print at custom_log.pl line 51.

转储程序的输出是:

$VAR1 = {                                                    
          'id_local' => '0',                                 
          'mail_time' => '1117579067',                       
          'id_global' => '2'                                 
        };

如果没有看到 %data 的转储,就不可能知道失败的原因,但是一些测试表明您的一个用户缺少 mail_time 键。如果我按如下方式创建 %data 并且 运行 您的脚本...

my %data = (
    users => {
        user1 => {
            id_local  => '0',
            mail_time => '1117579067',
            id_global => '2',
        },
        user2 => {
            id_local  => '0',
            # purposely missing mail_time <---
            id_global => '2',
        },
    },
);

然后我得到了你遇到的同样问题......输出如下

Use of uninitialized value $mailtime in print at custom_log.pl line 27.
1117579067

我喜欢 perl,因为你必须精确。 尝试通过以下方式读出您的价值:

print $users{$user_key}->{'mail_time'};

分别。

my $mailtime = $users{$user_key}->{'mail_time'};

或最终

print $users->{$user_key}->{'mail_time'};

我现在不完全了解您的哈希结构,但我认为第一个示例应该适合您,第二个示例仅适用于此情况。下次,请转储根哈希,在您的例子中为“$data{'user'}”以查看它的整个结构。此外,使用 perl 调试器也不错,它可以为您提供更多信息,只需使用 "perl -d scriptname.pl" 即可。祝你好运,干杯 ;-).