在标量上下文中展平 Perl 数组的方法
Posted
技术标签:
【中文标题】在标量上下文中展平 Perl 数组的方法【英文标题】:Ways to Flatten A Perl Array in Scalar Context 【发布时间】:2012-05-01 22:51:03 【问题描述】:我最近开始学习 perl,并且有一个问题在 Internet 上找不到明确的答案。说我有这样的东西,
@arr = (1, 2, 3);
$scal = "@arr"
# $scal is now 123.
使用引号是展平数组以使每个元素都存储在标量值中的唯一方法吗?这似乎不太可能,但我还没有找到任何其他方法来做到这一点。提前致谢。
【问题讨论】:
我不知道第三方模块是否曾经与$"
混淆并忘记将其恢复为默认值(请参阅下面 Dave Cross 的回答),但我完全遇到了这样的情况两个不同主机上的相同脚本为"@arr"
提供了两个不同的结果:一个中间有空格,一个没有。从来没有追查过原因(不同版本的 CPAN 模块,不同版本的 Perl?),我最终做了一个明确的join($delim, @arr)
。
【参考方案1】:
join
函数通常用于“展平”列表。让您在结果字符串中的每个元素之间指定您想要的内容。
$scal = join(",", @arr);
# $scal is no "1,2,3"
【讨论】:
如果您想丢弃除数组的第一个元素之外的所有内容,但又不必先将数组存储到变量中怎么办?【参考方案2】:在您的示例中,您在双引号字符串中插入一个数组。在这些情况下发生的事情是由 Perl 的 $"
变量控制的。来自perldoc perlvar:
$LIST_SEPARATOR
$"
当数组或数组切片插入双引号字符串或类似的上下文(例如 /.../ )时,其元素由该值分隔。默认为空格。例如,这个:
print "The array is: @array\n";
等价于:
print "The array is: " . join($", @array) . "\n";
助记符:在双引号上下文中工作。
$"
的默认值为空格。你显然可以改变$"
的值。
local $" = ':',
my @arr = (1, 2, 3);
my $scalar = "@arr"; # $scalar contains '1:2:3'
与 Perl 的任何特殊变量一样,最好将任何更改本地化在代码块中。
【讨论】:
如果数组中的任何值是 'undef',则会引发警告。如何解决? 取决于你想做什么。我可以想到三个明显的选择。 1/ 忽略警告。 2/ 在数组上使用grep
删除未定义的元素。 3/ 在数组上使用map
将未定义的元素转换为其他值(可能是空字符串)。如果您需要更多详细信息,您可能应该提出一个新问题。
这是我在很长一段时间内看到的对手册内容的最佳重新陈述之一。而且我不是在讽刺。 只需适当数量的有用上下文的优秀答案。【参考方案3】:
您也可以使用join
而不使用任何分隔符
my $scalar = join( '' , @array ) ;
有不止一种方法可以做到这一点。
【讨论】:
学究式地,这不是在没有分隔符的情况下使用join()
,而是使用带有空字符串作为分隔符的join()
:-)【参考方案4】:
本着 TIMTOWTDI 的精神:
my $scal;
$scal .= $_ foreach @arr;
【讨论】:
【参考方案5】:阅读section Context in perldata
。 Perl 有两个主要的上下文:标量和列表。
例如:
@a = (1, 1, 1); # list context
print @a; # list context
$count = @a; # scalar context, returns the number of elements in @a
等等
【讨论】:
这与 扁平化 数组无关。以上是关于在标量上下文中展平 Perl 数组的方法的主要内容,如果未能解决你的问题,请参考以下文章