Perl 上下文及其对操作的影响

数字和字符串上下文
在Perl中如何处理数据,如何求表达式的值,取决与上下文,不同操作符上下文不同。
$result = '123' + '345';  ## 468
$result = 123 . 345 ;  ##1233456

print "12 is less than 2!\n" if '12' lt '2';  ##lt为字符串比较
print "Oh noes! foo is bar!\n" if 'foo' == 'bar'; ## ==为数值比较符,foo和bar转换为数值0;


标量和列表上下文
档操作需要的是单个对象时,Perl会使用标量上下文。期望多个对象时,使用列表上下文。其实关键在于操作符,即在Perl语法中,操作符把上下文看成怎样的情景。如操作符两边需要的都是单个操作对象:

1 + 2;
'foo' . 'bar';
列表操作符期望操作的是多个元素,如print,它会取得一列元素并输出:
print reverse( 1..10 ) ."\n";
在Perl中,while的条件语句是标量上下文环境,而foreach的则是列表上下文:
while(标量上下文){...}
foreach(列表上下文){...}
加入要遍历某个文件句柄,对其中的每行内容进行处理,一旦发现 "__END__" 就立即停止。在while循环中,我们会依次读入一行内容进行处理,然后结束本次循环,继续读入文件句柄中的下一行:
while(<STDIN>){
	last if /__END__/;
	...;
}
$next_line = <STDIN>;
改为foreach:
foreach(<STDIN>){
	last if /__END__/;
	....;
}
$next_line = <STDIN>; ##完蛋了,没其他内容。
因为foreach的列表环境一次性把所有的内容都从STDIN中读出来了,STDIN里已经什么都没有了。一般while这样边度边处理的方式比较合适。


赋值操作决定的上下文
如果左值是一个列表,那么Perl认为右值是一个列表。如果左值是一个标量变量,右值只取标量变量部分。

如:

$n = ( 'a','b','c');  #$n为'a';
($n,$m) = ('a','b','c'); #$n为'a' $m为'b'
@arr = ('a','b','c');
@lines = <STDIN>;   #读入所有行
$line = <STDIN>; #只读取一行


空上下文结果

某些情况下,Perl会告诉我们空上下文结果操作毫无意义。比如打开warnings开关时,Perl会报:Useless use of a variable in void context
如:

some_sub(@args);
grep {/foo/} @array;
1 + 2;
##上面的计算结果,没有被使用


要点

  • Perl会根据操作符自动判断当前的上下文环境。
  • Perl会根据数字或字符串上下文来对标量作相应解释。
  • 在列表上下文或标量上下文中的计算结果可能完全不同。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值