在标量语境中展平Perl数组的方法

时间:2012-04-20 10:48:06

标签: arrays perl

我最近开始学习perl并且有一个问题,我在互联网上找不到明确的答案。说我有类似的东西,

@arr = (1, 2, 3);
$scal = "@arr"
# $scal is now 123.

是否使用引号来展平数组,以便每个元素都存储在标量值中?这似乎不太可能,但我还没有找到任何其他方法来做到这一点。提前谢谢。

5 个答案:

答案 0 :(得分:38)

join函数通常用于“展平”列表。允许您在结果字符串中指定每个元素之间的内容。

$scal = join(",", @arr);
# $scal is no "1,2,3"

答案 1 :(得分:17)

在您的示例中,您将在双引号字符串中插入数组。在这些情况下发生的事情是由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的任何特殊变量一样,最好定位代码块中的任何更改。

答案 2 :(得分:5)

你也可以在没有任何分隔符的情况下使用join

my $scalar = join( '' , @array ) ;

有多种方法可以做到。

答案 3 :(得分:5)

本着TIMTOWTDI的精神:

my $scal;
$scal .= $_ foreach @arr;

答案 4 :(得分:-2)

阅读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