Ответ 1
Функция join
обычно используется для "сглаживания" списков. Позволяет указать, что вы хотите между каждым элементом в результирующей строке.
$scal = join(",", @arr);
# $scal is no "1,2,3"
Недавно я начал изучать perl и задался вопросом, что я не нахожу однозначного ответа в Интернете. скажем, у меня что-то вроде этого,
@arr = (1, 2, 3);
$scal = "@arr"
# $scal is now 123.
Является ли использование кавычек единственным способом сгладить массив, чтобы каждый элемент хранился в скалярном значении? Это кажется невероятным, но я не нашел других способов сделать это. Спасибо заранее.
Функция join
обычно используется для "сглаживания" списков. Позволяет указать, что вы хотите между каждым элементом в результирующей строке.
$scal = join(",", @arr);
# $scal is no "1,2,3"
В вашем примере вы интерполируете массив в строке с двумя кавычками. Что происходит в этих обстоятельствах, контролируется переменной 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, всегда лучше локализовать любые изменения в кодовом блоке.
Вы также можете использовать join
без какого-либо seperator
my $scalar = join( '' , @array ) ;
Существует несколько способов сделать это.
в духе TIMTOWTDI:
my $scal;
$scal .= $_ foreach @arr;
Прочитайте раздел Контекст в perldata
. Perl имеет два основных контекста: скаляр и список.
Например:
@a = (1, 1, 1); # list context
print @a; # list context
$count = @a; # scalar context, returns the number of elements in @a
и др.