注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

FY

Johnson 's Blog

 
 
 

日志

 
 

我对 flw老大"上下文"理解的题目的摘录和理解.  

2012-05-05 13:32:03|  分类: perl |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
请说出下面的各个语句分别给 var[1-9] 赋予了什么样的值?
  1. #1
  2. $var1 = ( a=>1, b=>2, c=>3 );

  3. #2
  4. %var2 = ( a=>1, b=>2, c=>3 );

  5. #3
  6. $var3 = [ a=>1, b=>2, c=>3 ];

  7. #4
  8. %var4 = [ a=>1, b=>2, c=>3 ];

  9. #5
  10. $var5 = { a=>1, b=>2, c=>3 };

  11. #6
  12. %var6 = { a=>1, b=>2, c=>3 };

  13. #7
  14. @var7 = ( a=>1, b=>2, c=>3 );

  15. #8
  16. @var8 = [ a=>1, b=>2, c=>3 ];

  17. #9
  18. @var9 = { a=>1, b=>2, c=>3 };
  19. 答案请见续文............

以下是答案,是我自己整理的,有些情况题目也被我改过了,因为这样更能体现出"上下文"

#1
$var1 = ( a=>1, b=>2, c=>4 );
首先左侧为一个标量$var1,因此(a=>1,b=>2,c=>4)是在标量上下文中计算的结果。
此处(a=>1,b=>2,c=>4)应该不称为"列表",理解为由逗号分隔开的标量数据集合,(a=>1,b=>2,c=>4)应该放在期望列表的环境下才能称为列表(例如数组),

数组在标量上下文中才会返回列表元素的个数,,列表在标量上下文中返回它最后一个标量数据.
此处$var1应该就是最后边的元素4。

#2
%var2 = ( a=>1, b=>2, c=>4 );
左侧为一个hash变量,右侧 ( a=>1, b=>2, c=>4 )因此在列表上下文中计算结果,这里为一个hash赋值,输出内容应该就是列表中的所有内容(可能不按顺序);

#3
$var3 = [ a=>1, b=>2, c=>4 ];
左侧$var3为一个标量,右侧[]定义为一个匿名数组的引用,赋值后$var3也指向了此数组

#4
%var4 = [ a=>1, b=>2, c=>4 ];
左侧%var4是一个hash变量,列表上下文,右侧[]代表一个数组的匿名引用,
此处将一个标量赋值给一个hash
结果为hash的一个键值为array(地址值),value为undef

#5
$var5 = { a=>1, b=>2, c=>4 };
左侧为一个标量,右侧为一个匿名hash的引用,
因此$var5中存储的应该为hash的地址值(hash(地址值));

#6
%var6 = { a=>1, b=>2, c=>3 };
左侧为一个hash,右侧为一个匿名hash的引用,一个标量
标量赋值给hash
结果为hash的一个键值为hash(地址值),value为undef;

#7
@var7 = ( a=>1, b=>2, c=>3 );
此处为一个数组的赋值(将=》看成,)
因此@var7里的内容为(a,1,b,2,c,3);

#8
@var8 = [ a=>1, b=>2, c=>3 ];
此处左侧为一个数组,为列表上下文,右侧为一个匿名数组的引用,一个标量
将标量赋值给一个数组,数组的第一个元素存储此匿名引用,
输出内容应该为@var8的第一个元素,应该为数组的地址array(地址值);


#9
@var9 = { a=>1, b=>2, c=>3 };
此处左侧为一个数组,为列表上下文,右侧为一个匿名hash的引用,一个标量,
将标量赋值给一个数组,数组的第一个元素存储此匿名引用,
输出内容应该@var9的第一个元素,值为右侧hash地址,hash(地址值);

##############################################
再出几道更难的:(这几道不是我创的)
1,检查对"引用"和"my及 local"的认识深度。
这题我自己来回答
  1. $foo = 'a';
  2. $bar = \$foo;
  3. {
  4.     my $foo = 'b';
  5.     print $$bar;   # 输出什么? 
  6. }

  7. {
  8.     local $foo = 'c';
  9.     print $$bar;   # 输出什么?
  10. }

  11. {
  12.     $foo = 'd';
  13.     print $$bar;    # 输出什么? 
  14. }
复制代码
第一个print打印出'a',首先要注意引用和别名的区别.这里用的引用,它是对包变量$foo的引用.
第二个print处.还是$foo的引用,而引用只针对"地址",所以打印出的还是包变量$foo里的值,即'a'
如果这里直接用print $foo,
第三个print处,. $foo='d'已经对"包变量$foo"进行了重新赋值,所以这里访问到的其实是包变量里的值,即'd' 

2,检查对"引用"和"上下文"的认识深度。
  1. sub val { return 2..4 }; 
  2. $ref1 = \(&val); 
  3. print ref $ref1, "\n";  # 输出什么?
  4. $ref2 = \(val()); 
  5. print ref $ref2, " $$ref2\n";  # 输出什么?
  6. ($ref3) = \(val()); 
  7. print ref $ref3, " $$ref3\n";  # 输出什么?

第一个输出CODE,表示这是个对函数的引用
每二个首先(val())返回是一个列表, val函数中的..操作在list context中执行range操作,所以返回 (2,3,4)这么一个列表,
紧接着$ref2=\(2,3,4)等价于$ref2=(\2,\3,\4),所以此时列表在标量环境下只返回最后一个元素\4,也就是$ref2=\4;
所以打印第二个就是SCALAR 4
第三个,相当于($ref3)=\(2,3,4),也等价于($ref3)=(\2,\3,\4);而在列表环境中自然返回\2给$ref3
在函数val来看,它永远处在list context中,因为(val())这样的用法,所以return 2..4在list context, ..就执行了range操作,同时也就返回 (2,3,4)这样一个列表.于是就变成了($ref3)=\(2,3,4)
在些我正好贴出CU上有关 ..这个操作符在不同context中的作用 链接
########################
use feature qw(say);
use strict;

my $value1 = (1,2);
my $value2 = (1..2);
########################

第一个赋值编译没有问题,赋值2;第二个报错"Use of uninitialized value in range (or flip) at test.pl line 5."
个人理解,赋值时标量上下文环境,左边是标量变量,右边应该进行相应的转换。 



以下是zhlong8的解释:
.. 在 scalar context 下是 flip flop 操作符,而不是 range
  评论这张
 
阅读(185)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018