上下文
Perl最独特的特性在于它的代码对于上下文是敏感的。每个Perl的表达式要么在scalar上下文中求值,要么在列表上下文中求值,取决于此处期望产生一个scalar还是列表。许多Perl表达式和内置函数在不同的求值上下文中的行为大相径庭。
Scalar的赋值例如$scalar =
会在scalar上下文求值,在这种例子中,表达式为"Mendeleev"
,而返回的是同样的scalar值"Mendeleev"
:
my $scalar = "Mendeleev";
Array或者hash的赋值例如@array =
或者%hash =
会在列表上下文求值,在列表上下文中求值的列表就会返回这个列表本身,然后被用于初始化这个array或者hash:
my @array = ("Alpha", "Beta", "Gamma", "Pie");
my %hash = ("Alpha" => "Beta", "Gamma" => "Pie");
到目前为止还没什么特别的。
在列表上下文中求值的scalar表达式会被转换成含有一个元素的列表:
my @array = "Mendeleev"; # 与'my @array = ("Mendeleev");'等价
在scalar上下文中求值的列表表达式会返回列表中的最后一个scalar:
my $scalar = ("Alpha", "Beta", "Gamma", "Pie"); # $scalar的值现在是"Pie"
在scalar上下文中求值的array(还记得array和列表不同吗?)表达式返回该数组的长度:
my @array = ("Alpha", "Beta", "Gamma", "Pie");
my $scalar = @array; # $scalar的值现在是4
[print](http://perldoc.perl.org/functions/print.html)
内置函数在列表上下文中求对所有的参数求值。事实上,print
能够接受无限个参数的列表,并且一个接一个地打印它们,这就意味着我们可以直接用它来打印array:
my @array = ("Alpha", "Beta", "Goo");
my $scalar = "-X-";
print @array; # "AlphaBetaGoo";
print $scalar, @array, 98; # "-X-AlphaBetaGoo98";
你可以用内置函数[scalar](http://perldoc.perl.org/functions/scalar.html)
强制让任何表达式在scalar上下文进行求值,这就是我们为什么用scalar
来得到array的长度。
即使子过程要在scalar上下文进行求值,语法上也没有规定必须要返回一个scalar,就像我们看到的,Perl完全可以为你捏造一个需要的结果。