所谓上下文,就是指表达式所在的位置。在 Perl 解析表达式时,要么希望得到一个标量,要么希望得到一个列表。在这个表达式上,Perl 希望得到什么,这就是该表达式的上下文。
比如有以下脚本内容:
[Perl] 纯文本查看 复制代码 #!/usr/bin/perl
@people = qw( Tom Jasmine Molly );
@sorted = sort @people;
$number = 42 + @people;
print "$number \n";
上面,sort 操作符会读取列表的值,并且根据内部字符编码进行排序。所以 @sorted = sort @people; 这条表达式属于列表上下文。再看 $number = 42 + @people; 这条语句,$number 是一个标量,所以表达式是求标量值,因此这里属于标量上下文。那么在标量上下文中,返回的是数组中的元素个数,所以最后的打印结果会为 45 (42 + 3) 。
再看一个 reverse 操作符的例子。当它在列表上下文中,它返回的是逆序后的列表;在标量上下文中,返回的则是逆序后的字符串。如下代码:
[Perl] 纯文本查看 复制代码 #!/usr/bin/perl
@name = reverse qw/www groad net/;
$name = reverse qw/www groad net/;
foreach (@name) {
print "$_ ";
}
print "\n";
print "$name \n";
运行输出:
./context.pl
net groad www
tendaorgwww
使用 scalar 强制指定标量上下文
scalar 是个伪函数,它用来告诉 Perl 被它指示的地方要切换到标量上下文中。下面看一个例子:
[Perl] 纯文本查看 复制代码 #!/usr/bin/perl
@name = qw/www groad net/;
print "Welcome to @name \n";
print "This domain is ", scalar @name, " years old!\n";
运行输出:./context.pl
Welcome to www groad net
This domain is 3 years old! |