上下文

Perl最独特的特性在于它的代码对于上下文是敏感的每个Perl的表达式要么在scalar上下文中求值,要么在列表上下文中求值,取决于此处期望产生一个scalar还是列表。许多Perl表达式和内置函数在不同的求值上下文中的行为大相径庭。

Scalar的赋值例如$scalar =会在scalar上下文求值,在这种例子中,表达式为"Mendeleev",而返回的是同样的scalar值"Mendeleev"

  1. my $scalar = "Mendeleev";

Array或者hash的赋值例如@array =或者%hash =会在列表上下文求值,在列表上下文中求值的列表就会返回这个列表本身,然后被用于初始化这个array或者hash:

  1. my @array = ("Alpha", "Beta", "Gamma", "Pie");
  2. my %hash = ("Alpha" => "Beta", "Gamma" => "Pie");

到目前为止还没什么特别的。

在列表上下文中求值的scalar表达式会被转换成含有一个元素的列表:

  1. my @array = "Mendeleev"; # 与'my @array = ("Mendeleev");'等价

在scalar上下文中求值的列表表达式会返回列表中的最后一个scalar

  1. my $scalar = ("Alpha", "Beta", "Gamma", "Pie"); # $scalar的值现在是"Pie"

在scalar上下文中求值的array(还记得array和列表不同吗?)表达式返回该数组的长度

  1. my @array = ("Alpha", "Beta", "Gamma", "Pie");
  2. my $scalar = @array; # $scalar的值现在是4

[print](http://perldoc.perl.org/functions/print.html)内置函数在列表上下文中求对所有的参数求值。事实上,print能够接受无限个参数的列表,并且一个接一个地打印它们,这就意味着我们可以直接用它来打印array:

  1. my @array = ("Alpha", "Beta", "Goo");
  2. my $scalar = "-X-";
  3. print @array; # "AlphaBetaGoo";
  4. print $scalar, @array, 98; # "-X-AlphaBetaGoo98";

你可以用内置函数[scalar](http://perldoc.perl.org/functions/scalar.html)强制让任何表达式在scalar上下文进行求值,这就是我们为什么用scalar来得到array的长度。

即使子过程要在scalar上下文进行求值,语法上也没有规定必须要返回一个scalar,就像我们看到的,Perl完全可以为你捏造一个需要的结果。