在Perl中,每N个字符插入一个char的最佳方法

Teu*_*uxe 2 algorithm perl string-matching

我想在Perl中找到最好的方法,在字符串中每N个字符插入一个char.假设我有以下内容:

my $str = 'ABCDEFGH';
Run Code Online (Sandbox Code Playgroud)

我想每两个字符插入一个空格,以便我得到:

my $finalstr = 'AB CD EF GH';
Run Code Online (Sandbox Code Playgroud)

无辜的方式是:

my $finalstr;
while ($str =~ s/(..)//) {
    $finalstr .= $1.' ';
}
Run Code Online (Sandbox Code Playgroud)

(但最后一个空间并没有让我开心.)

我们可以做得更好吗?是否可以使用单个替换模式s ///,尤其是使用相同的字符串$ str(而不是使用$ finalstr)?


下一步:做同样的事情,但要切割模式之前和之后的文本(并保留,当然),例如'<<'和'>>':

my $str       = 'blah <<ABCDEFGH>> blah';
my $finalstr1 = 'blah <<AB CD EF GH>> blah';
my $finalstr2 = 'blah << AB CD EF GH >> blah';  # alternate
Run Code Online (Sandbox Code Playgroud)

Mil*_*ler 8

使用正向前瞻和后向断言来插入空格:

my $str = 'ABCDEFGH';

$str =~ s/..\K(?=.)/ /sg;

use Data::Dump;
dd $str;
Run Code Online (Sandbox Code Playgroud)

输出:

"AB CD EF GH"
Run Code Online (Sandbox Code Playgroud)

增强限制翻译

如果要将此修改仅应用于字符串的一部分,请将其分解为多个步骤:

my $str = 'blah <<ABCDEFGH>> blah';

$str =~ s{<<\K(.*?)(?=>>)}{$1 =~ s/..\K(?=.)/ /sgr}esg;

use Data::Dump;
dd $str;
Run Code Online (Sandbox Code Playgroud)

输出:

"blah <<AB CD EF GH>> blah"
Run Code Online (Sandbox Code Playgroud)