gpt4 book ai didi

perl - 在 Perl 中,将字符串转换为其字符列表的明智方法是什么?

转载 作者:行者123 更新时间:2023-12-04 13:01:12 24 4
gpt4 key购买 nike

我一直想知道是否有更好但更简洁的方法将字符串拆分为其字符

@characters = split //, $string

并不难读,但不知何故,正则表达式的使用对我来说似乎有点过头了。

我想出了这个:
@characters = map { substr $string, $_, 1 } 0 .. length($string) - 1

但我觉得它更丑,可读性更差。将该字符串拆分为其字符的首选方法是什么?

最佳答案

各种示例和速度比较。

我认为看看某些方法在每个字符上拆分字符串的速度有多快可能是个好主意。

我对碰巧在我电脑上的几个 Perl 版本进行了测试。

测试文件

use 5.010;
use Benchmark qw(:all) ;
my %bench = (
'split' => sub{
state $string = 'x' x 1000;
my @chars = split //, $string;
\@chars;
},
'split-string' => sub{
state $string = 'x' x 1000;
my @chars = split '', $string;
\@chars;
},
'split-capture' => sub{
state $string = 'x' x 1000;
my @chars = split /(.)/, $string;
\@chars;
},
'unpack' => sub{
state $string = 'x' x 1000;
my @chars = unpack( '(a)*', $string );
\@chars;
},
'match' => sub{
state $string = 'x' x 1000;
my @chars = $string =~ /./gs;
\@chars;
},
'match-capture' => sub{
state $string = 'x' x 1000;
my @chars = $string =~ /(.)/gs;
\@chars;
},
'map-substr' => sub{
state $string = 'x' x 1000;
my @chars = map { substr $string, $_, 1 } 0 .. length($string) - 1;
\@chars;
},
);
# set the initial state of $string
$_->() for values %bench;
cmpthese( -10, \%bench );
for perl in /usr/bin/perl /opt/perl-5.10.1/bin/perl /opt/perl-5.11.2/bin/perl;
do
$perl -v | perl -nlE'if( /(v5\.\d+\.\d+)/ ){
say "## Perl $1";
say "<pre>";
last;
}';
$perl test.pl;
echo -e '</pre>\n';
done

Perl v5.10.0

Rate split-capture match-capture map-substr match unpack split split-string
分流捕获 296/s -- -20% -20% -23% -58% -63% -63%
匹配捕获 368/s 24% -- -0% -4% -48% -54% -54%
map-substr 370/s 25% 0% -- -3% -48% -53% -54%
匹配 382/s 29% 4% 3% -- -46% -52% -52%
拆包 709/s 140% 93% 92% 86% -- -11% -11%
拆分 793/s 168% 115% 114% 107% 12% -- -0%
分串 795/s 169% 116% 115% 108% 12% 0% --

Perl v5.10.1

Rate split-capture map-substr match-capture match unpack split split-string
分流捕获 301/s -- -31% -41% -47% -60% -65% -66%
map-substr 435/s 45% -- -14% -23% -42% -50% -50%
比赛捕获 506/s 68% 16% -- -10% -32% -42% -42%
匹配 565/s 88% 30% 12% -- -24% -35% -35%
拆包 743/s 147% 71% 47% 32% -- -15% -15%
分割 869/s 189% 100% 72% 54% 17% -- -1%
分串 875/s 191% 101% 73% 55% 18% 1% --

Perl v5.11.2

Rate split-capture match-capture match map-substr unpack split-string split
分流捕获 300/s -- -28% -32% -38% -59% -63% -63%
匹配捕获 420/s 40% -- -5% -13% -42% -48% -49%
匹配 441/s 47% 5% -- -9% -39% -46% -46%
map-substr 482/s 60% 15% 9% -- -34% -41% -41%
拆包 727/s 142% 73% 65% 51% -- -10% -11%
分串 811/s 170% 93% 84% 68% 12% -- -1%
拆分 816/s 171% 94% 85% 69% 12% 1% --

正如你所看到的,split 是最快的,因为这是 split 的代码中的一个特例。 .

split-capture 是最慢的,可能是因为它必须设置 $1 ,以及其他几个匹配变量。

所以我建议使用普通的 split //, ... ,或大致等效的 split '', ... .

关于perl - 在 Perl 中,将字符串转换为其字符列表的明智方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2356406/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com