变量具有正确的值,但显示“未初始化值”警告

问题描述:

存在包含某些数据的散列,其用户部分符合我的兴趣。变量具有正确的值,但显示“未初始化值”警告

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
即使打印命令也会输出正确的值和无意义的警告,如下所示。

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

的自卸车的输出是:

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

'使用未初始化的值$邮件在...'处打印''print $ mailtime;' – shampoo

+0

您确定为每个用户设置了“mail_time”吗?是为循环的每个迭代给出的警告还是只针对特定的'$ user_key'? – kba

+0

@Mat:当然可以。做到了。 – shampoo

没有看到的%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 
+0

这是真的,谢谢你的帮助。 – shampoo

+0

当出现不可思议的问题时,请输入一个特殊的调试语句,如“print STDERR”UNDEFINED mailtime:$ user_key \ n“if!$ mailtime;甚至可以完全转储该元素。 – Gilbert

我喜欢的perl,因为你必须准确。 尝试用读出你的价值:

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

RESP。

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

或最终

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

我做你的哈希值不是现在正是结构,但我认为第一个例子应该为你的作品,第二个是公正的情况。下一次,请转储root-hash,在你的例子“$ data {'user'}”中查看它的整个结构。此外,使用perl-debugger并不错,它提供了更多信息,只需使用“perl -d scriptname.pl”即可。祝你好运,欢呼声;-)。