- 论坛徽章:
- 46
|
本帖最后由 zhlong8 于 2011-07-15 17:12 编辑
- =head1 关于 uninitialized value 警告的小结
- 很多初学者问这个警告,自己参考 perldoc 写了个小结,也算为 CU 贡献一份力量。
- =head2 Use of uninitialized value %s
- 在打开警告(-w, -W, use warnings, $^W)时,把一个未初始化的 B<scalar> 值像已
- 初始始化那样用的时候就会出现这个警告。实际产生的原因是:未初始化的变量的值为
- undef。
- 根据环境 undef 被解释为 '', 0,但是很多时候它可能由程序员的 typo 导致,所以
- B<不推荐>关闭这个警告,为了避免它请给你的变量初始化。比如:
- $people{name} = 'xiaoming';
- print "hello $people{mame}\n"; #错把 $name 写成 $mame
- =head2 利用警告查找程序错误
- 在警告后面的字段 perl 会提示错误的原因,如未初始化变量的名字等,如果某些情况下
- 无法提示变量名它也会告诉你 perl 在执行什么操作的时候你用了未初始化的值,尽力帮
- 你定位程序的错误位置。
- 然而 perl 在优化你的程序后发出的警告可能不像你的原始语句那样明了了,这个时候
- 你就需要聪明点猜测下到底是在哪里用了 undef 才触发了这个警告,一般来讲警告提供的
- 上下文已经足够了。
- 比较常见的一个是
- Use of uninitialized value $x in concatenation (.) or string at line X.
- 出现这个错误并不意味着你就用 . 字符串连接符了,可能你是在双引号字符串里面使用
- 了变量替换,而替换的变量没有初始化。你应该先查找下自己代码的 第 x 行,就像提示
- 的那样,而不是脑袋一热就发贴求救。
- =head2 关闭这个警告
- 很多书里面都推荐程序应该以 'use strict; use warnings;' 开头,的确有了它们往往
- 你就不需要很高超的 debug 技巧,就可以解决大多数错误了。所以请在你清楚自己
- 干什么和付出的代价的时候,可以考虑关闭这个功能。方法有:
- 不使用 warning 功能(-w, -W, use warnings, $^W)
- lexical scope 里面用 no warnings(但是也关闭了很多其它警告,不推荐)
- 仅仅只关闭这个警告,在lexical scope 里面用 no warnings qw(uninitialized)
- =head2 例外
- 即使在打开警告的情况下,某些对未初始始化变量的操作也不会触发这个警告。
- boolean context 包括但不仅限于
- 控制结构 if, unless, while, until, given, when, ?:
- 逻辑关系 and, or, xor, not, &&, ||, //, !……
- 注:&& || // 其实不是纯粹的逻辑运算符它们是短路的,这里只是为了方便归类。
- 同理 ?: 也不是控制结构。
- 赋值时右侧的未初始化变量不会触发警告。
- 存在性测试操作符
- exists
- defined
- 以下操作符
- delete
- scalar
- undef
- ref
- ++ --
- \
- ~~
- ?:
- 总的来说在 boolean context 下,或者不实际使用未初始化变量或 undef 值就不会警告。
- 详情参见 perldoc 。
复制代码 请大家努力挑刺,争取消灭本版关于 "uninitialized value" 的帖子。 |
|