给定1到10个字符长的随机字母数字字符串(A-Z0-9),我想在从alpha变为数字或从数字变为alpha时插入连字符。
我现在有一些可行的东西,但我确信它看起来很糟糕。我知道有一个更好的方法可以解决这个问题,但办公室的某个人今天早上做的咖啡很少,或者至少这是我要去的借口。 ;)
我必须这样做〜1500万次,所以越快越好。
代码片段:
my @letters = split //, $string;
my $type;
foreach my $letter ( @letters ) {
if (! $type) {
if ($letter =~ /^[A-Z]$/) {
$type = 'a'
}
else {
$type = 'd'
}
$string = $letter;
next;
}
else {
if ($type eq 'a') {
if ($letter =~ /^[0-9]$/) {
$string .= '-' . $letter;
$type = 'd';
next;
}
else {
$sring .= $letter;
}
}
else {
if ($letter =~ /^[A-Z]$/) {
etc, etc.
呃,只是看着它就疼。
答案 0 :(得分:2)
这应该有效:
$string =~ s/([A-Z])([0-9])/$1-$2/g;
$string =~ s/([0-9])([A-Z])/$1-$2/g;
如果您想要不区分大小写,请添加/i
修饰符。
可能更快(因为它避免了捕获),但需要5.10:
$string =~ s/[A-Z]\K(?=[0-9])/-/g;
$string =~ s/[0-9]\K(?=[A-Z])/-/g;