22

我最近开始学习 perl 并且有一个问题,我在 Internet 上找不到明确的答案。说我有这样的东西,

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

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

4

5 回答 5

44

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

$scal = join(",", @arr);
# $scal is no "1,2,3"
于 2012-04-20T10:53:04.997 回答
18

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

于 2012-04-20T12:56:01.520 回答
6

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

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

有不止一种方法可以做到这一点。

于 2012-04-20T10:52:57.797 回答
5

本着 TIMTOWDI 的精神:

my $scal;
$scal .= $_ foreach @arr;
于 2012-04-20T10:58:01.873 回答
-2

阅读中的上下文部分perldata。Perl 有两个主要的上下文:标量和列表。

例如:

@a = (1, 1, 1);   # list context
print @a;         # list context
$count = @a;      # scalar context, returns the number of elements in @a

等等

于 2012-04-20T10:54:36.623 回答