使用Perl提取前导文本的最快方法

Ron*_*Ron 1 regex string perl

我有类似的东西$string = ABC_RPM_LOL , GELO_FRE_OPN 我想提取ABCGELO.(第一个下划线之前的单词).

使用Perl实现这一目标的最快方法是什么?

Can*_*ice 5

你可以使用的正则表达式是:

$string =~ /^([A-Z]+)_/;
$value = $1;
Run Code Online (Sandbox Code Playgroud)

这假设您的单词仅由大写字母组成.如果它们是混合的情况,请i在正则表达式的末尾抛出:/^([A-Z]+)_/i.

编辑:既然你要求最快的方式,这里有一个比较我的正则表达式和Lazarus的split基准:

#!perl

use strict;
use warnings;

use Benchmark qw/ :all /;

my $string = "ABC_RPM_LOL";
my $value;

my $count = 10_000_000;
cmpthese( $count, {
    'regex' => sub { $string =~ /^([A-Z]+)_/; $value = $1; },
        'split' => sub { ($value) = split /_/, $string; }
});
Run Code Online (Sandbox Code Playgroud)

结果:

           Rate regex split
regex 1869159/s    --  -29%
split 2624672/s   40%    --
Run Code Online (Sandbox Code Playgroud)

所以split更快一点.

编辑第二个:我在这里添加了三个其他答案:

'split2' => sub { $value = (split('_',$string))[0]; },
'split3' => sub { ($value) = split /_/, $string, 2; },
'substr' => sub { $value = substr $string, 0, index $string, '_'; },
Run Code Online (Sandbox Code Playgroud)

而新的结果:

            Rate  regex split2 split3  split substr
regex  1848429/s     --    -8%   -27%   -28%   -63%
split2 2008032/s     9%     --   -21%   -22%   -60%
split3 2538071/s    37%    26%     --    -1%   -50%
split  2570694/s    39%    28%     1%     --   -49%
substr 5050505/s   173%   152%    99%    96%     --
Run Code Online (Sandbox Code Playgroud)

tadmc的substr答案是最快答案.