用hash引用时别忘了初始化
来源:互联网 发布:localhost修改php 编辑:程序博客网 时间:2024/05/23 00:45
版权声明:可以任意转载,但转载时必须标明原作者charlee、原始链接http://tech.idv2.com/2008/10/09/remember-to-init-hashref/以及本声明。
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>
相信很多人都写过下面这种函数,把参数当作hash引用来赋值:
sub foo { my $hash = shift; $hash->{foo} = 'bar';}
然后这样调用:
foo($a);
调用之后,$a就变成了一个hash引用,里面包含了 foo => 'bar' 这一对值。当然你可能会说,干嘛要在foo里面修改参数,直接return $hash不行吗。当然可以,而且我也推荐使用return的方式,不过有时候foo函数可能会很复杂,或者由于其他的原因而不得不使用修改参数的方式。
且慢!这种用法有时候会会失败。看下面的例子:
#!/usr/bin/perluse Data::Dumper;sub foo { my $h = shift; $h->{hello} = 'World!';}my $a;my $b = {};foo($a); print Dumper($a);foo($b); print Dumper($b);
运行结果:
$VAR1 = undef;$VAR1 = { 'hello' => 'World!' };
为什么$a执行foo后仍然为undef,而$b就有值?
这是因为,my $a; 没有对$a初始化,此时$a的值为undef。而调用foo时,参数实际上是传值调用,$a的undef值被赋给了$h变量,此时$h = undef。而下一行将$h作为hash引用赋值时,系统会自动为$h赋一个空引用作为初始值。 ——但是,这个空引用以及接下来赋给的 hello => 'World!' 的值不会传回给外面的 $a,因为是值传递!
而$b则不同,初始化成一个空hash引用,这样传递给foo的就是个真正的引用值,这样 hello => 'World!'的赋值可以赋给该引用。
所以,在使用hash引用时,初始化是非常必要的。
才一条评论,欢迎发表高见!
- 用hash引用时别忘了初始化
- [Perl]用hash引用时别忘了初始化
- 初始化引用
- 正确传递hash引用
- perl 引用/hash
- 标量 ,数组,hash 引用
- 标量 数组 hash 引用
- 解hash引用
- perl 引用(数组和hash引用)
- 引用的初始化
- C++初始化和引用
- AppDelegate初始化快捷引用
- 引用类型数组初始化
- 引用变量的初始化
- 用了Mounty后移动硬盘没有初始化
- C++类中变量也可以是引用哈------要用初始化列表来初始化
- 返回局部对象的引用,返回函数内部用new初始化的指针的引用
- 普通引用和const引用的初始化
- 查询表中第X到第Y表数据方法
- 关于在在struts中写正则表达式遇到java.lang.NoClassDefFoundError: org/apache/oro/text/perl/Perl5Util的解决办法
- Servlet 过滤器大全(转)
- DotNetCharting控件来实现Web绘图
- 字节序问题--大端法小端法
- 用hash引用时别忘了初始化
- 利用对象序列化深表克隆对象
- js选取值,全选,datagrid,datalist 全选反选
- perl 文件读写详细说明
- 清空SQL Server数据库日志的SQL语句
- 在.net中使用Gmail发送邮件
- 使用Delphi编写COM组件
- ASP.NET 2.0如何实现URL映射
- 书签学习
2008-10-10 17:22
不仅是hash,其他也一样。
至少你可以明白你定义的这个变量是属于哪个类型。
只是定义my $a;这样,以后自己看了也费事。
如果是my $a=0;至少能明白这里是个数值,$a={],$a=()。都能看上明白点哦。
学习了。。