这段程序是书中的解答.在第9,12行中使 用了模式捕获.给哈希赋值时使用捕获到的模式赋值.从输出结果可以看到,哈希中叧包含了需要的值,没有多余的前导空白.
这段代码以Perl的眼光来看,还是有点罗嗦的.程序中的第11行是可以屏蔽掉的.
这样写之后,程序中没有了对哈希中匿名数组引用的定义.
假设此时程序要把Skipper的blue shirt存入哈希,会发生什么事情?
存储动作发生在第13行,此时等价的语句是:
- push @{$provisions{'The Skipper'}},"blue shirt";
但是,由于屏蔽了第11行,此时$provisions{"The Skipper"}并不存在.而程序却还把它当做一个数组的引用来使用.
为了解决返个问题,Perl会自动的在变量中插入一个空匿名数组的引用,并继续之后的操作.在这个程序中,新建立的(Perl自动的)空数组的引用被解引用,并在数组中插 入了(push) blue shirt返个属性.
这样的处理过程叫做autovivification(自动形象化——直译,理解上类似于自动按需构造正确的对象).对于任何不存在的变量,或者是变量的值为undef,如果对其做解引用以取其地址(专业来说,是出于左值上下文),都会被自动的赋值成一个不其右值类型相同的空引用,并继续后继操作.
This process is called autovivification.Any nonexistent variable,or a variable containing undef,which we dereference while looking for a variable location(technically called an lvalue context),is automatically stuffed with the appropriate reference to an empty item,and Perl allows the operation to proceed.
这一段是书上的原话,感觉说得实在是拗口的不得了,而且黑体字部分感觉上和实际的有矛盾,从黑体字来理解,对变量做解引用是为了获得变量的地址,而实际写程序时,对变量做解引用是为了获得地址是变量的值的数据的值(也挺拗口的,残念啊).
1. 对象:未定义的变量戒者值为undef的变量.
2. 条件:对变量做解引用,即以变量的值位地址,并在左值.即是对地址为变量值的内存区域赋值.
3. 结果:变量被自劢的赋值为右值数据的引用.(实际过程是,变量先被赋值为一个和右值
数据类型相同的空引用,然后再执行赋值操作——如果有赋值操作的话.)