【问题标题】:Array in scalar context in PerlPerl中标量上下文中的数组
【发布时间】:2013-10-25 09:26:47
【问题描述】:
在 Perl 中,如果您将一个数组分配给一个标量,您将获得该数组的长度。
例子:
my @arr = (1,2,3,4);
my $x = @arr;
现在如果你检查$x的内容,你会发现$x包含@arr数组的长度。
我想知道 Perl 这样做的原因。背后的原因是什么?我尝试了我的水平,但找不到任何好的理由。那么,有人可以帮助我了解发生的幕后原因吗?
【问题讨论】:
标签:
perl
perl-data-structures
【解决方案1】:
Perl 使用上下文,而其他语言使用函数来获取一些信息或在不同类型之间转换值。上下文的概念在 perldata 手册页 (man perldata) 中有详尽的解释。
在 Perl 中,相同的数据在不同的上下文中看起来会有所不同。数组在列表上下文中看起来像是其元素的列表,而在标量上下文中看起来像是其元素的数量。
在标量上下文中它还能怎么看?
- 它可能是数组的第一个元素。这可以通过
my ($x) = @arr; 或my $x = shift @arr; 或my $x = $arr[0]; 完成。
- 它可能是数组的最后一个元素。这可以通过
my ($x) = reverse @arr; 或my $x = pop @arr; 或my $x = $arr[-1]; 完成。
我想不出任何其他合理的方法来从数组中生成标量。显然使用数组长度作为其标量值比这两个要好,因为它在某种程度上是数组的全局属性,而这两个是相当局部的。当您在标量上下文中查看数组的典型用法时,这也是非常合乎逻辑的:
die "Not enough arguments" if @ARGV < 5;
您可以很自然地将< 解读为“小于”。