用hash引用时别忘了初始化

来源:互联网 发布:localhost修改php 编辑:程序博客网 时间:2024/05/23 00:45

 

<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引用时,初始化是非常必要的。

 


看完这篇文章后感觉怎样?如果还需要更多的内容,可以看看下面这些,也许会对你有帮助:

  • [Perl]文件测试符-C的用法
  • [Perl]高级Perl编程学习笔记
  • [Perl]最强Perl执行时间测试工具 - Devel::NYTProf
  • [Perl]使用DProf测定程序执行效率
  • [Perl]标量环境和列表环境总结
  • [Perl]/xc3/xc2问题的原因
  • [Perl]引用传递和值传递
  • [Perl]关于m//g的问题
  • [Perl]管道、进程及其他
  • [Perl]用XML::Simple解析XML文件

才一条评论,欢迎发表高见!
#1
smallfish
2008-10-10 17:22

不仅是hash,其他也一样。

至少你可以明白你定义的这个变量是属于哪个类型。
只是定义my $a;这样,以后自己看了也费事。
如果是my $a=0;至少能明白这里是个数值,$a={],$a=()。都能看上明白点哦。

学习了。。

原创粉丝点击