在标量上下文中展平 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 数组的方法的主要内容,如果未能解决你的问题,请参考以下文章

Perl语言学习,不要停哟~~

网络目录上的 perl readdir() - 标量与列表上下文和网络性能

如何在 Perl 中找到哈希中的键数?

Python中是不是有类似于Perl中的“想要”的东西

Perl:展平多维数组的最简单方法是啥?

如何在 Azure 数据工厂中正确展平分号数组?