注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

FY

Johnson 's Blog

 
 
 

日志

 
 

关于 uninitialized value 警告的小结  

2012-04-27 22:30:36|  分类: perl |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
LINK

  1. =head1 关于 uninitialized value 警告的小结

  2. 很多初学者问这个警告,自己参考 perldoc 写了个小结,也算为 CU 贡献一份力量。

  3. =head2 Use of uninitialized value %s

  4. 在打开警告(-w, -W, use warnings, $^W)时,把一个未初始化的 B<scalar> 值像已
  5. 初始始化那样用的时候就会出现这个警告。实际产生的原因是:未初始化的变量的值为
  6. undef。

  7. 根据环境 undef 被解释为 '', 0,但是很多时候它可能由程序员的 typo 导致,所以
  8. B<不推荐>关闭这个警告,为了避免它请给你的变量初始化。比如:

  9.     $people{name} = 'xiaoming';
  10.     print "hello $people{mame}\n";    #错把 $name 写成 $mame

  11. =head2 利用警告查找程序错误

  12. 在警告后面的字段 perl 会提示错误的原因,如未初始化变量的名字等,如果某些情况下
  13. 无法提示变量名它也会告诉你 perl 在执行什么操作的时候你用了未初始化的值,尽力帮
  14. 你定位程序的错误位置。

  15. 然而 perl 在优化你的程序后发出的警告可能不像你的原始语句那样明了了,这个时候
  16. 你就需要聪明点猜测下到底是在哪里用了 undef 才触发了这个警告,一般来讲警告提供的
  17. 上下文已经足够了。

  18. 比较常见的一个是

  19.     Use of uninitialized value $x in concatenation (.) or string at line X.

  20. 出现这个错误并不意味着你就用 . 字符串连接符了,可能你是在双引号字符串里面使用
  21. 了变量替换,而替换的变量没有初始化。你应该先查找下自己代码的 第 x 行,就像提示
  22. 的那样,而不是脑袋一热就发贴求救。

  23. =head2 关闭这个警告

  24. 很多书里面都推荐程序应该以 'use strict; use warnings;' 开头,的确有了它们往往
  25. 你就不需要很高超的 debug 技巧,就可以解决大多数错误了。所以请在你清楚自己
  26. 干什么和付出的代价的时候,可以考虑关闭这个功能。方法有:

  27.     不使用 warning 功能(-w, -W, use warnings, $^W)

  28.     lexical scope 里面用 no warnings(但是也关闭了很多其它警告,不推荐)

  29.     仅仅只关闭这个警告,在lexical scope 里面用 no warnings qw(uninitialized)

  30. =head2 例外

  31. 即使在打开警告的情况下,某些对未初始始化变量的操作也不会触发这个警告。

  32. boolean context 包括但不仅限于

  33.     控制结构 if, unless, while, until, given, when, ?:
  34.     逻辑关系 and, or, xor, not, &&, ||, //, !……

  35. 注:&& || // 其实不是纯粹的逻辑运算符它们是短路的,这里只是为了方便归类。
  36. 同理 ?: 也不是控制结构。

  37. 赋值时右侧的未初始化变量不会触发警告。

  38. 存在性测试操作符

  39.     exists
  40.     defined

  41. 以下操作符

  42.     delete
  43.     scalar
  44.     undef
  45.     ref
  46.     ++ --
  47.     \
  48.     ~~
  49.     ?:

  50. 总的来说在 boolean context 下,或者不实际使用未初始化变量或 undef 值就不会警告。
  51. 详情参见 perldoc 。
复制代码
请大家努力挑刺,争取消灭本版关于 "uninitialized value" 的帖子。
  评论这张
 
阅读(694)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018