我有类似的东西$string = ABC_RPM_LOL , GELO_FRE_OPN
我想提取ABC和GELO.(第一个下划线之前的单词).
使用Perl实现这一目标的最快方法是什么?
你可以使用的正则表达式是:
$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)