Можно использовать следующее регулярное выражение:
$string =~ /^([A-Z]+)_/;
$value = $1;
Это предполагает, что ваши слова состоят только из заглавных букв.Если это смешанный регистр, добавьте i
в конце регулярного выражения: /^([A-Z]+)_/i
.
Редактировать: Так как вы попросили самый быстрый способ, вот сравнительный тест моегоregex и Lazarus's 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; }
});
Результаты:
Rate regex split
regex 1869159/s -- -29%
split 2624672/s 40% --
Так что split
намного быстрее.
Редактирование второго : я добавил три других ответа здесь:
'split2' => sub { $value = (split('_',$string))[0]; },
'split3' => sub { ($value) = split /_/, $string, 2; },
'substr' => sub { $value = substr $string, 0, index $string, '_'; },
И новые результаты:
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% --
tadmc's substr
ответ является самым быстрым с огромным отрывом.