在Perl中,有上下文影响操作符和函数的行为:
scalar)— 表达式计算为一个值。list)— 表达式计算为值的列表。函数和操作符根据上下文可能返回不同的结果。
示例:
my @arr = (1, 2, 3); my $count = @arr; # 标量上下文:$count = 3 my @copy = @arr; # 列表上下文:复制整个数组 my $line = <STDIN>; # 读取一行(标量) my @lines = <STDIN>; # 读取所有行(列表)
可以通过函数scalar()显式设置上下文:
my $last_idx = scalar @arr; # 强制标量上下文
在标量上下文中,函数
keys %hash会返回什么值?
回答: 将返回哈希中的元素数量,而不是像在列表上下文中那样返回键的列表。
my %h = (a=>1, b=>2); my $num = keys %h; # $num = 2 my @keys = keys %h; # @keys = ('a', 'b')
故事
在一个项目中计算数组元素的数量:
my @items = get_items(); my $cnt = @items;后来有人决定赋值
$cnt = get_items();,未理解函数返回的是一个列表——现在始终只得到一个(第一个)返回值,而不是元素的数量。
故事
从文件中读取行:
my $lines = <FILE>;期待获得整个文件,但只得到了第一行——未考虑到标量上下文返回的是唯一的一行。
故事
开发者在void上下文中调用函数,而未使用获得的值:
open_my_file(); # 函数返回文件描述符,但没有保存这使得调试变得复杂——函数正常工作,但文件没有被保存,错误也没有被捕获。