Perl:长字符串转换为逗号分隔的字节列表

Perl:长字符串转换为逗号分隔的字节列表,perl,Perl,我想将ABCDEF转换为A、B、C、D、E、F 使用Perl最快的方法是什么 我有很多字符串要转换,字符串的长度可达32768字节。因此,我想降低字符串转换的开销。怎么样 $string =~ s/.\K(?=.)/,/g; # using \K keep escape $string =~ s/(?<=.)(?=.)/,/g; # pure lookaround assertion 要找到最快的解决方案,请使用 额外积分: Rate

我想将
ABCDEF
转换为
A、B、C、D、E、F

使用Perl最快的方法是什么

我有很多字符串要转换,字符串的长度可达32768字节。因此,我想降低字符串转换的开销。

怎么样

$string =~ s/.\K(?=.)/,/g;       # using \K keep escape
$string =~ s/(?<=.)(?=.)/,/g;    # pure lookaround assertion
要找到最快的解决方案,请使用

额外积分:

                 Rate  splitjoin lookaround       keep
splitjoin   6546367/s         --        -6%       -47%
lookaround  6985568/s         7%         --       -44%
keep       12392841/s        89%        77%         --
这是我尝试的基准测试的结果。令人惊讶的是,
\K
转义比纯粹的lookaround快得多,后者大约与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)' 
});

如果您试图以较低的开销打印字符串,您可能希望在解析字符串时只打印字符串,而不是在内存中进行整个转换,即

while (m/(.)\B/gc){
 print "$1,";
};
if (m/\G(.)/) {
  print "$1\n";
}

似乎总是在同一时间提交。。。回答得好。@Lucas谢谢你。是的,竞争有时很激烈。
unpack'(a)*'
split/
快,但不足以超过“keep”。我喜欢这些。我在
unpack
功能中思考过,但不习惯。而且似乎很快+1@Birei,按我的
cmp运行,
(A)*
版本的速度不到keep的一半。我还在想Broncoffan7是否真的想要这些字母,因为他说“字节”。
\B
很聪明,但前提是字符串中没有标点符号和其他单词边界字符。是的,如果字符串不像问题中那样简单,他们可能需要延迟打印每个字母,直到看到下一个字母,这样他们就可以把最后一张剪掉并打印出来。不过,m/()/g方法仍应具有适应性。
my $str = "ABCDEFGHIJKL";

my @chars = $str =~ /./sg;

print join ",", @chars;
$ perl -le 'print join(",", unpack("(A)*", "hello"))'
h,e,l,l,o

$ perl -le 'print join(",", unpack("C*", "hello"))'
104,101,108,108,111

$ perl -le 'print join(",", unpack("(H2)*", "hello"))'
68,65,6c,6c,6f
while (m/(.)\B/gc){
 print "$1,";
};
if (m/\G(.)/) {
  print "$1\n";
}