Как насчет
$string =~ s/.\K(?=.)/,/g; # using \K keep escape
$string =~ s/(?<=.)(?=.)/,/g; # pure lookaround assertion
Или
$string = join ",", split(//, $string);
Чтобы найти быстрое решение, использовать Benchmark
.
Дополнительный кредит:
Это результат теста я попробовал. Удивительно, но побег \K
намного быстрее, чем чистый обход, который примерно так же быстро, как и split/join.
use strict;
use warnings;
use Benchmark qw(cmpthese);
my $string = "ABCDEF" x 1000;
cmpthese(-1, {
keep => 'my $s = $string; $s =~ s/.\K(?=.)/,/g',
lookaround => 'my $s = $string; $s =~ s/(?<=.)(?=.)/,/g',
splitjoin => 'my $s = $string; $s = join ",", split(//, $string)'
});
Выход:
Rate splitjoin lookaround keep
splitjoin 6546367/s -- -6% -47%
lookaround 6985568/s 7% -- -44%
keep 12392841/s 89% 77% --
Кажется, всегда подавайте в то же время ... Хороший ответ. – Lucas
@ Lucas Спасибо. Да, конкуренция иногда бывает жестокой. – TLP
'unpack '(a) *'' быстрее, чем 'split //', но недостаточно, чтобы догнать «keep». – ikegami