免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 21507 | 回复: 14

关于 uninitialized value 警告的小结 [复制链接]

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2010-10-21 14:10 |显示全部楼层
本帖最后由 zhlong8 于 2011-07-15 17:12 编辑
  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" 的帖子。

论坛徽章:
0
发表于 2010-10-21 15:13 |显示全部楼层
赋值时右侧的末初始化变量不会触发警告。


我其实一直比较迷惑为什么这个不会触发警告。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2010-10-21 15:28 |显示全部楼层
我其实一直比较迷惑为什么这个不会触发警告。
兰花仙子 发表于 2010-10-21 15:13

因为 undef 也是值啊。

论坛徽章:
0
发表于 2010-10-21 20:02 |显示全部楼层
本帖最后由 黑色阳光_cu 于 2010-10-21 20:05 编辑

挺好

论坛徽章:
0
发表于 2010-10-21 21:20 |显示全部楼层
回复 3# flw


    是的,是一个perl 特殊对待的值。

论坛徽章:
0
发表于 2010-10-22 09:24 |显示全部楼层
good

论坛徽章:
0
发表于 2011-07-14 10:56 |显示全部楼层
不错不错!

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2011-07-15 17:10 |显示全部楼层
我眼花了吗?

末初始化 还是 未初始化 ?

帖子里怎么都是“末初始化”
reallyfly_1 发表于 2011-07-15 16:37



    眼光独到,谁让它们长这么像 {:2_167:} 等我销毁证据

论坛徽章:
0
发表于 2011-07-16 10:02 |显示全部楼层
学习一下

论坛徽章:
0
发表于 2011-12-13 15:13 |显示全部楼层
回复 1# zhlong8
  my %url2num = ();
    foreach my $newLine (@newLines3){
            my @fields7 = split(/,/,$newLine);
            my $url = $fields7[6];
            if(!(exists $url2num{$url})){
                    $url2num{$url} = 1 ;
                    print RR $newLine . "\n";
            }          

  my hash = ();算是初始化吧????
  为何报错  :Use of uninitialized value $url in exists at。。。。。。。。   $url 我明明定义了啊!
  Use of uninitialized value $url in exists at .....................
  Use of uninitialized value $url in hash element at ....................
这两个报错,不是说明 exists的特例不对????
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP