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";
}