Способы сглаживания массива Perl в скалярном контексте

Недавно я начал изучать perl и задался вопросом, что я не нахожу однозначного ответа в Интернете. скажем, у меня что-то вроде этого,

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

Является ли использование кавычек единственным способом сгладить массив, чтобы каждый элемент хранился в скалярном значении? Это кажется невероятным, но я не нашел других способов сделать это. Спасибо заранее.

Ответы

Ответ 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, всегда лучше локализовать любые изменения в кодовом блоке.

Ответ 3

Вы также можете использовать join без какого-либо seperator

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

Существует несколько способов сделать это.

Ответ 4

в духе TIMTOWTDI:

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

Ответ 5

Прочитайте раздел Контекст в perldata. Perl имеет два основных контекста: скаляр и список.

Например:

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

и др.